0

我的目录有 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

这没有显示任何东西。有什么问题?

4

4 回答 4

3

您可以使用 find 并查看文件类型,然后使用 -exec 更改所有文件,然后附加 .html。

find main-directory -type f -exec mv -v '{}' '{}'.html \; 
于 2011-06-09T02:57:40.570 回答
1

在您的第一个for循环中,该mv命令不应使用反引号。

在第二个for循环中,if 语句的语法不正确。没有thenfi。它应该是:

for file in `ls -1R main-directory`
do
if [ -f "$file" ]
then
   echo $file
fi
done

但即便如此,这也行不通,因为ls -1R main-directory只给你文件名,而不是文件的绝对路径。将您的回声移到 if 语句之外进行测试:

for file in `ls -1R main-directory`
do
   echo $file
done

因此ls -1R main-directory不是获取当前目录中所有文件的好方法。改为使用find . -type f

于 2011-06-09T07:34:41.587 回答
0

出于某种原因,我永远记不起find ... -exec头顶上的语法{}\;. 相反,我养成了只使用从 find 提供的循环的习惯:

find main-directory -type f | while read file
do
    mv "$file" "$file.html"
done

find将每个文件输出到标准输出,read file一次使用一行并将该行的内容设置为$file环境变量。然后,您可以在循环主体的任何位置使用它。

我使用这种方法来解决很多像这样的小问题,我需要遍历一堆输出并做一些有用的事情。因为它更通用,所以我使用它比深奥的find ... -exec {} \;方法更多。

另一个技巧是在echo对您的系统进行可能损坏的事情之前,在您的命令之前进行快速的健全性检查:

find find main-directory -type f | while read file
do
    echo mv "$file" "$file.html"
done
于 2011-06-09T14:36:16.243 回答
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/:$//'检测到:行尾的 a 并将其删除。这是阻止我的代码运行的原因之一,因为每当检测到一个目录时,它都会在末尾ls -1R main-directory附加一个:

于 2011-06-09T18:56:39.763 回答