重命名路径名为
问题描述:
的文件
我有一些类型为.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
答
你不需要任何循环。
您可以使用命令重命名,检索并重新使用任何带有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循环的东西)。每个文件夹中只有一个文件? 您可以查看基本名称和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
那会返回一个可用的文件名?
您的文件路径中有两个“xxx”位,并且您的示例输出中有一个“xxx”位。你想要哪个“xxx”? – spinkus
我只想要第一个'xxx'并将'_01'附加到所有.csv文件的末尾 –