如何批量复制和重命名具有相同名称的文件在不同的文件夹到一个单独的文件夹与文件重命名到他们的父文件夹在linux中?<



假设我有一个名为user/john/john1,john2john3的文件夹,每个文件夹中都有一个名为dog.txt的文件。我想创建一个名为johns_dogs的单独文件夹,并将每个文件夹中的所有dog.txt复制到这个新文件夹中,但将文件重命名为john1_dog.txt,john2_dog.txt,john3_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

这就是我想做的…但不管用,我不知道为什么?

一种选择是通过参数扩展使用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

字符串替换细节:

new="${f////_}"  # replace all '/' with '_' in original path to create new path
new="${new/._user_john_/./johns_dogs/}" # replace '._user_john_' with './johns_dogs' to complete new path

在类似的情况下,我的方法是:

  • 使用ls命令创建一个"long"文件列表。(每行一个完整的文件名)
  • Pipe into a text file
  • 在支持列编辑的编辑器中打开文本文件
  • 复制一列文件名到剪贴板
  • 将复制的列保留在剪贴板中:
    • 编辑文件名列,以便将其转换为目标文件名。(使用列模式和/或搜索并替换)
  • 将剪贴板中的原始文件名列粘贴到文本文件中,就在更改后的文件名列之前。
  • 在每行开始前加上cp
  • 将文本文件保存为shell脚本。(前置#!bash,做必要的chmod)
  • 运行shell脚本。

这可能看起来工作量很大,但实际上您可以非常快地完成它(只要您不必手动修改每一行),它的最大好处是您可以用眼睛检查它,并且有相当高的信心,一旦运行,它将做正确的事情,而脚本可能会破坏您的文件系统,您只有在事后才会知道。

我的意思是,请不要误解我的意思,我是一名软件工程师,我以写代码为生,我通过写代码来解决问题,但有些情况下,写代码是不值得的。

相关内容

  • 没有找到相关文章

最新更新