之前,我有一个目录,看起来像这样:地带人物时期如果文件名有前缀中的Bash
pages/
folder1/
folder1.filename1.txt
folder1.filename2.txt
folder2/
folder2.filename4.txt
folder2.filename5.txt
folder3/
filename6.txt
我希望它看起来像这样:
pages/
folder1/
filename1.txt
filename2.txt
folder2/
filename3.txt
filename4.txt
folder3/
filename5.txt
随着ls * | sed -e s/^[^.]*.// > /tmp/filenames.txt
我得到一个文件包含:
filename1.txt
filename2.txt
filename3.txt
filename4.txt
txt
我怎么能告诉sed将忽略格式为[filename].[suffix]
的文件名,只查看表格[foldername].[filename].[suffix]
的文件名?
最终的脚本(如指出,find命令将简化事情,但这个工作):
for folder in $(ls .)
do
if test -d $folder
then
pushd $folder
ls * | sed 's/.*\.\(.*\..*\)/\1/' > /tmp/filenames.txt
ls * > /tmp/current.txt
exec 3</tmp/current.txt
exec 4</tmp/filenames.txt
while read file <&3; read name <&4;
do
mv "$file" "$name"
done
rm /tmp/current.txt
rm /tmp/filenames.txt
popd
else
echo $folder "not a directory"
fi
done
exit 0
本页面现在是一个社区的wiki。您可以在下面添加更多的优雅的解决方案:
for folder in $(ls .)
do
something better
你可能有/想'pushd'的地方在那里。 – 2009-11-16 11:54:59
同样你也想精确地“$ {文件夹}”。前缀删除,或任何三个块(点分隔)文件名的第一部分? – 2009-11-16 11:56:10
@Douglas哎呀,意外删除了pushd。我把它放回去了。是的,这是正确的。 – terrace 2009-11-16 12:00:27