假设我有一个名为user/john/john1
,john2
和john3
的文件夹,每个文件夹中都有一个名为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脚本。
这可能看起来工作量很大,但实际上您可以非常快地完成它(只要您不必手动修改每一行),它的最大好处是您可以用眼睛检查它,并且有相当高的信心,一旦运行,它将做正确的事情,而脚本可能会破坏您的文件系统,您只有在事后才会知道。
我的意思是,请不要误解我的意思,我是一名软件工程师,我以写代码为生,我通过写代码来解决问题,但有些情况下,写代码是不值得的。