我的目录有2个子目录,而且子目录也很少,而且有一些文件。我需要重命名所有文件以将html扩展名附加到文件名。 目录结构如下所示
main-directory
sub-directory
sub-directory
sub-directory
file1
file2
and so on to lot of files
现在我不能使用这样的东西
for file in main-directory/*
do
if [ -f "$file" ]
then `mv "$file" "$file.html"`
fi
done
因为for循环不会递归使用路径。所以我使用了这样的东西
for file in `ls -1R main-directory` // -1 for showing file and directory names separated by new lines and -R for recursive travel
do
if [ -f "$file" ]
then `mv "$file" "$file.html"`
fi
done
上面的代码无法重命名文件。检查是否行
for file in `ls -1R main-directory`
工作我写了这样的东西
for file in `ls -1R main-directory`
do
if [ -f "$file" ]
echo $file
done
这没有显示任何内容。什么可能是错的?
答案 0 :(得分:3)
您可以使用find查看类型文件,然后使用-exec更改所有文件,然后附加.html。
find main-directory -type f -exec mv -v '{}' '{}'.html \;
答案 1 :(得分:1)
在您的第一个for
循环中,mv
命令不应该在后面。“
在第二个for
循环中,if语句的语法不正确。没有then
或fi
。它应该是:
for file in `ls -1R main-directory`
do
if [ -f "$file" ]
then
echo $file
fi
done
但即使这样,这也行不通,因为ls -1R main-directory
只提供文件名,而不是文件的绝对路径。将你的echo移到if语句之外进行测试:
for file in `ls -1R main-directory`
do
echo $file
done
因此ls -1R main-directory
不是获取当前目录中所有文件的好方法。请改用find . -type f
。
答案 2 :(得分:0)
出于某种原因,我永远无法记住find ... -exec
与{}
和\;
之间的语法。相反,我已经养成了使用从find中提供的循环的习惯:
find main-directory -type f | while read file
do
mv "$file" "$file.html"
done
find
将每个文件输出到stdout,read file
一次只消耗一行,并将该行的内容设置为$file
环境变量。然后,您可以在循环体中的任何位置使用它。
我使用这种方法来解决许多小问题,我需要循环一堆输出并做一些有用的事情。因为它更通用,我使用它比深奥的find ... -exec {} \;
方法更多。
另一个技巧是在echo
前面加上命令,以便在对系统造成潜在破坏性的事情之前进行快速的健全性检查:
find find main-directory -type f | while read file
do
echo mv "$file" "$file.html"
done
答案 3 :(得分:0)
这是我的问题的答案。人们回应了1个衬里,这是一个很好的方法,但我没有从这1个衬里得到很多,所以这里是我想要的东西
IFS=$'\n' // this is for setting field separator to new line because the default is whitespace
dir=main-directory
for file in `ls -1R main-directory | sed 's/:$//'` // -1 for showing file and directory names separated by new lines and -R for recursive travel
do
if [ -f "$dir/$file" ]
then `mv "$dir/$file" "$dir/$file.html"`
elif [ -d "$file" ]
then dir=$file
fi
done
此处sed 's/:$//'
在行尾检测到:
并将其删除。这是妨碍我的代码运行的因素之一,因为每当ls -1R main-directory
检测到一个目录时,它会在末尾追加: