Bash 使用路径名重命名文件
我有一些.csv类型的文件,但它们的名称不同。理想情况下,我希望脚本找到所有.csv类型的文件,并使用其路径名重命名文件 重命名文件时,这些文件应如下所示:Bash 使用路径名重命名文件,bash,rename,Bash,Rename,我有一些.csv类型的文件,但它们的名称不同。理想情况下,我希望脚本找到所有.csv类型的文件,并使用其路径名重命名文件 重命名文件时,这些文件应如下所示: /home/doc/funds2015/folder xxx/folder 123/Folder xxx/something1.csv /home/doc/funds2015/folder xxx/folder 123/Folder xxx/something2.csv xxx_123_01_01.csv xxx_123_02_0
/home/doc/funds2015/folder xxx/folder 123/Folder xxx/something1.csv
/home/doc/funds2015/folder xxx/folder 123/Folder xxx/something2.csv
xxx_123_01_01.csv
xxx_123_02_01.csv
有人能帮我重新构造代码,在一个干净的循环中完成这项工作吗。我对bash还不太熟悉
oldpath= "/home/doc/funds2015"
for file in $(find $oldpath -type f -name something1.csv); do
shortname=${file#$oldpath/}
newname="${shortname "some reg ex"}"
if [ -f $newname ]; then
echo "$newname already exists."
else
echo "copy: $file"
echo " --> $newname"
cp $file $newname
fi
done
for file in $(find $oldpath -type f -name something2.csv); do
shortname=${file#$oldpath/}
newname="$oldpath "some reg ex"}"
if [ -f $newname ]; then
echo "$newname already exists."
else
echo "copy: $file"
echo " --> $newname"
cp $file $newname
fi
done
你不需要任何循环 您可以使用命令重命名、检索和重用perl表达式中的任何表达式 以下是此类表达的一些示例:
rename -n "s/^.*([0-9]{3}).*$/Clannad_c\$1/" *
rename -n "s/^(.*)c([0-9]{3})\/(.*)$/\$1c\$2\/Clannad_c\$2p\$3/" */*
rename -n "s/(.*)\/(.*)/\$1\/\$1p\$2/" */*
rename -n "s/^.*([0-9]{4}).*$/Hajime\ no\ Ippo_c\$1/" *
rename -n "s/(c[0-9]{3}_p[0-9]{2}.jpg)$/v38_\$1/" Vagabond_v38*/*
您可以将路径或文件名的任何部分与()匹配,并使用$1、$2、。。。使用shell扩展,您甚至不需要执行循环(/)
如果我坚持使用与您尝试的更接近的命令,我会使用命令find及其选项-exec
以下是一个例子:
find "$sourceDir*v0$volumeNumber*" -type f -name "*.(jpg|png)" -exec zip --quiet -r $newVolume {} +
这个命令可以找到一些jpg和png文件并对它们进行压缩。您不需要任何循环 您可以使用命令重命名、检索和重用perl表达式中的任何表达式 以下是此类表达的一些示例:
rename -n "s/^.*([0-9]{3}).*$/Clannad_c\$1/" *
rename -n "s/^(.*)c([0-9]{3})\/(.*)$/\$1c\$2\/Clannad_c\$2p\$3/" */*
rename -n "s/(.*)\/(.*)/\$1\/\$1p\$2/" */*
rename -n "s/^.*([0-9]{4}).*$/Hajime\ no\ Ippo_c\$1/" *
rename -n "s/(c[0-9]{3}_p[0-9]{2}.jpg)$/v38_\$1/" Vagabond_v38*/*
您可以将路径或文件名的任何部分与()匹配,并使用$1、$2、。。。使用shell扩展,您甚至不需要执行循环(/)
如果我坚持使用与您尝试的更接近的命令,我会使用命令find及其选项-exec
以下是一个例子:
find "$sourceDir*v0$volumeNumber*" -type f -name "*.(jpg|png)" -exec zip --quiet -r $newVolume {} +
这个命令找到一些jpg和png文件并压缩它们。只是一个想法(没有for循环)。每个文件夹中是否只有一个文件?
您可以签出basename和dirname命令。也许再加上tr。
比如:
提供路径(不带文件名部分)
只提供文件名,不提供路径
所以
这将返回一个可用的文件名?只是一个想法(没有for循环的东西)。每个文件夹中是否只有一个文件?
您可以签出basename和dirname命令。也许再加上tr。
比如:
提供路径(不带文件名部分)
只提供文件名,不提供路径
所以
这将返回一个可用的文件名?您的文件路径中有两个“xxx”位,您的示例输出中有一个“xxx”。您想要哪个“xxx”?我只想要第一个“xxx”,并将“\u 01”附加到所有.csv文件的末尾。您的文件路径中有两个“xxx”位,您的示例输出中有一个“xxx”。您想要哪个“xxx”?我只想要第一个“xxx”,并将“\u 01”附加到所有.csv文件的末尾
path_reformatted=$(dirname /home/doc/folder12/folder34/file.csv | tr "/" "_")
filename=$(basename /home/doc/folder12/folder34/file.csv | tr "/" "_")
new_filename=$path_reformatted$filename
mv $old_filename $new_filename