[英]How do batch copy and rename files with same names under different folders to a separate folder with files renamed to their parent folder in linux?
假设我有名为user/john/john1
、 john2
和john3
的文件夹,每个文件夹中都有一个名为dog.txt
的文件。 我想创建一个名为johns_dogs
的单独文件夹,并将每个文件夹中的所有dog.txt
复制到这个新文件夹中,但文件重命名为john1_dog.txt
、 john2_dog.txt
、 john3_dog.txt
。
我怎么会go这个呢? 我想我可以为此使用 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 字符串替换来为每个文件构建所需的 output 路径:
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
命令创建文件的“长”列表。 (每行一个完整的文件名。)cp
。#!bash
前面加上必要的chmod
)这看起来工作量很大,但实际上你可以很快完成(只要你不必手动修改每一行)而且它的最大好处是你可以用眼睛检查它并有一个相当高的信心,一旦运行,它就会做正确的事情,而脚本可能会破坏你的文件系统,你只会在事后才知道。
我的意思是,请不要误会我的意思,我是一名软件工程师,我以编写代码为生,我通过编写代码来解决问题,但在某些情况下不值得编写代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.