根据父目录的名称递归编辑文件

根据父目录的名称递归编辑文件

我有一个包含数百个文件夹的大目录,所有文件夹都遵循命名方案“a_b_x”,其中 x 是一个随机单词。每个文件夹中都有 3 个文本文件,所有文件都包含几个包含“a_b_x”的字符串。

我正在尝试重命名所有目录并将文件内的字符串从“a_b_x”更改为“a_x”,这意味着“b_”应该被删除。我希望通过一些 sed 魔法来完成此任务,因为手动编辑所有文件将需要几个小时。

答案1

你应该永远避免解析输出ls。试试这个(感谢斯蒂芬·查泽拉斯用于建议./*/):

for folder in ./*/; do     
      sed -i 's/_b//g' "$f"/*; mv "$folder" "${folder/_b/}"; 
 done

答案2

给你

root@testbox:~# mkdir test
root@testbox:~# cd test
root@testbox:~/test# mkdir -p a_b_x{1..10} # populate directories
root@testbox:~/test# printf 'a_b_x\na_b_y\nfoo\nbar\n' | \
    tee a_b_x{1..10}/somefile # populate files
a_b_x
a_b_y
foo
bar

重命名目录:

root@testbox:~/test# find . -name a_b_\* -type d -print0 | \
    xargs -r0 rename -v 's/a_b_/a_/'
./a_b_x10 renamed as ./a_x10
./a_b_x5 renamed as ./a_x5
./a_b_x7 renamed as ./a_x7
./a_b_x4 renamed as ./a_x4
./a_b_x8 renamed as ./a_x8
./a_b_x3 renamed as ./a_x3
./a_b_x9 renamed as ./a_x9
./a_b_x6 renamed as ./a_x6
./a_b_x1 renamed as ./a_x1
./a_b_x2 renamed as ./a_x2

编辑文件:

root@testbox:~/test# find . ! -name \*.bak -type f -print0 | xargs -r0 sed -i.bak 's,a_b_,a_,'
root@testbox:~/test# cat a_x4/somefile
a_x
a_y
foo
bar

如果一切正常,删除备份:

root@vm8583:~/test# find . -name \*.bak -type f -delete

答案3

您可以使用此命令:

for folder in $(ls); do
    for file in $(ls $folder); do
        sed -i 's/_b//' $folder/$file
    done
    mv $folder ${folder/_b/}
done
  • 第一个循环是浏览目录。

  • 第二个循环是编辑文件夹中文件的内容。

    离开第二个循环后,第一个循环是重命名文件夹。

处理文件名中的空格的另一种方法将被解释为 IFS :

ls | while read folder ; do
 ls "$folder" | while read file; do
  sed -i 's/_b//' "$folder/$file"
 done
 mv "$folder" "${folder/_b/}"
done

相关内容