无法在linux中处理for循环中的目录文件

时间:2011-06-09 02:51:38

标签: linux bash for-loop directory file-rename

我的目录有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 个答案:

答案 0 :(得分:3)

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

find main-directory -type f -exec mv -v '{}' '{}'.html \; 

答案 1 :(得分: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只提供文件名,而不是文件的绝对路径。将你的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检测到一个目录时,它会在末尾追加: