我有一些类型为.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_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
答案 0 :(得分:0)
您不需要任何循环。
您可以使用命令重命名,检索并重用任何带有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文件并将其压缩。
答案 1 :(得分:0)
只是一个想法(没有for循环的东西)。每个文件夹中只有一个文件吗? 您可以查看 basename 和 dirname 命令。也许还有 tr 。 像:
dirname /home/doc/folder12/folder34/file.csv | tr "/" "_"
为您提供路径(没有文件名部分)
basename /home/doc/folder12/folder34/file.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
会返回一个可用的文件名吗?