如何批量复制和重命名不同文件夹下的同名文件到一个单独的文件夹,文件重命名到他们的父文件夹在linux?

mrwjdhj3  于 2022-11-22  发布在  Linux
关注(0)|答案(2)|浏览(183)

假设我有名为user/john/john1john2john3的文件夹,每个文件夹中都有一个名为dog.txt的文件。我想创建一个名为johns_dogs的单独文件夹,并将每个文件夹中的所有dog.txt复制到这个新文件夹中,但将文件重命名为john1_dog.txtjohn2_dog.txtjohn3_dog.txt
我该怎么做呢?我假设我可以用一个for循环来做这个,我已经试过了...我只是看起来不能把它做对;特别隔离文件夹名称以应用于使用linux终端的文件名。使用GUI不是一个选项。谢谢:)

for fname in user/john/*/dog.txt;
do
  new_name=basename $(PWD)
  cp user/john/*/dog.txt > $new_name.txt;
done

这就是我一直想做的...但它不起作用,我不知道为什么?

bxgwgixi

bxgwgixi1#

一种选择是通过参数扩展使用bash字符串替换,为每个文件构建所需的输出路径:

for f in ./user/john/*/dog.txt ; do 
    new="${f//\//_}"
    new="${new/._user_john_/./johns_dogs/}"
    cp "$f" "$new"
done

或作为一行程序:

for f in ./user/john/*/dog.txt ; do new="${f//\//_}" ; new="${new/._user_john_/./johns_dogs/}" ; cp "$f" "$new"; done

运行以上命令后.johns_dogs目录的内容:

find ./johns_dogs/*
./johns_dogs/john1_dog.txt
./johns_dogs/john2_dog.txt
./johns_dogs/john3_dog.txt
./johns_dogs/john4_dog.txt
./johns_dogs/john5_dog.txt

字符串替换详细信息:
第一个

vzgqcmou

vzgqcmou2#

在类似的情况下,我的方法不是一些完全不可理解的、靠巫术工作的、写测试调试然后扔掉的脚本,而是如下所示:

  • 使用ls命令创建一个“长”文件列表(每行一个完整的文件名)。
  • 用管道将其导入文本文件。
  • 在支持列编辑的编辑器中打开文本文件。
  • 将文件名列复制到剪贴板。
  • 将复制的列保留在剪贴板中时:
  • 编辑文件名列,以便将其转换为目标文件名。(使用列模式和/或搜索和替换。)
  • 将原始文件名列从剪贴板粘贴到文本文件中,正好在更改文件名列之前。
  • 在每行的开头预先加上cp
  • 将文本文件保存为shell脚本。(在前面加上#!bash,执行必要的chmod
  • 运行shell脚本。

这看起来可能需要很多工作,但实际上你可以很快完成(只要你不必手动修改每一行),它的巨大好处是你可以用眼睛检查它,并有相当高的信心,一旦运行,它会做正确的事情,而脚本可能会破坏你的文件系统,你只能在事后才知道。
我的意思是,请不要误解我的意思,我是一个软件工程师,我以写代码为生,我通过写代码来解决问题,但在某些情况下,写代码是不值得的。

相关问题