击。当我使用files =`find ...`找到一个文件时,然后在$ files"中使用for循环"表示文件。如何访问找到的文件的路径?

时间:2014-05-08 20:05:09

标签: bash loops for-loop rename

 files=`find C:/PATH/TO/DIRECTORY -name *.txt`

 for file in $files; do
 #need code to rename $file, by moving it into the same directory

例如。 $ file在C:/ PATH / TO / DIRECTORY / 2014-05-08中找到。 如何将$ file重命名为该目录而不是C:/ PATH / TO / DIRECTORY?

3 个答案:

答案 0 :(得分:2)

您可以在查找中使用-execdir选项:

find C:/PATH/TO/DIRECTORY -name '*.txt' -execdir mv '{}' '{}'-new \;

根据man find

  

-execdir utility [argument ...] ;

     

-execdir primary与-exec primary相同,但实用程序将被执行   从包含当前文件的目录。

答案 1 :(得分:0)

find C:/PATH/TO/DIRECTORY -name \*.txt | while read file
do
   dir=$(dirname "$file")
   base=$(basename "$file")
   mv "$file" "$dir/new_file_name"
done

答案 2 :(得分:0)

使用此结构可以提供更好的服务:

while read fname
do
  ....
done < <(find ...)

或者,如果您没有使用bash

find ... | while read fname
do
  ....
done

find的输出存储在变量中,甚至执行for fname in $(find ...)的问题是在空格上进行单词拆分。如果你有一个带有换行符的文件名,上面的结构仍然会失败,因为他们假设你每行有一个文件名,但它们比你现在的要好。

更好的解决方案是这样的:

find ... -print0 | xargs -0 -n1 -Ixxx somescript.sh "xxx"

但即使这样,如果文件名中包含引号或其他内容,也可能会出现问题。

底线是解析任意数据(文件名可以是)很难......