我的文件结构如下:
My_Files:
|-- Folder_1:
| |-- a.txt
| |-- b.txt
| |-- c.txt
|
|-- Folder_2:
|-- a.txt
|-- b.txt
我有大约 200 个这样的文件夹。
我想要的是:
我想复制我的文件并将同名文件重命名到一个文件夹中,如下所示:
Final_Folder:
|-- a.txt
|-- b.txt
|-- c.txt
|-- a1.txt (Renamed)
|-- b1.txt (Renamed)
我做了什么:
我使用了这个命令,但没有找到结果:
find My_Files/ -type f -print0 | xargs -0 cp -t Final_Folder/
输出如下:
cp:不会用“Final_Folder/a.txt”覆盖刚刚创建的“Folder_1/a.txt”
cp:不会用“Final_Folder/b.txt”覆盖刚刚创建的“Folder_1/b.txt”
cp:不会用“Final_Folder/c.txt”覆盖刚刚创建的“Folder_1/c.txt”
cp:不会用“Final_Folder/a.txt”覆盖刚刚创建的“Folder_2/a.txt”
cp:不会用“Final_Folder/b.txt”覆盖刚刚创建的“Folder_2/b.txt”
我怎样才能达到我的目标?
提前致谢。
答案1
考虑到您的方案,并假设Folder 1, Folder 2, Folder 3 etc.
实际上确实具有某种意义(否则您可以将当前时间戳附加到您必须避免出现问题的每个文件名),我将使用以下命令(确保该文件夹Final_Folder
事先存在):
find . -path ./Final_Folder -prune -o -type f -exec sh -c 'fn=$(basename -- {}) ; suffix=$(dirname {} | tr / _ ) ; cp {} ./Final_Folder/${fn%.*}$suffix.${fn##*.}; ' \;
文件命名方案将遵循这样的方案:
[basename filename]._[basepath folder 1]_[basepath folder2]_[basepath folder[3..n].[extension]
或者换句话说,Final_Folder 内容将是:
a._Folder_1.txt
a._Folder_2.txt
a._Folder_3.txt
b._Folder_1.txt
b._Folder_2.txt
b._Folder_3.txt
c._Folder_1.txt
c._Folder_2.txt
c._Folder_3.txt
这个方案的好处是,如果您的层次结构类似于:
[YEAR]/[MONTH]/[DAY]/[filename a,b,c].txt
就像数据收集时经常做的那样
如果您从顶级目录运行上述命令,您今天复制到的文件名将Final_Folder
被命名为:”
a._2019_11_10.txt
b._2019_11_10.txt
c._2019_11_10.txt
.
.
.
[a,b,c]._2019_11_10.[WITH OTHER EXTENSIONS]
对特定类型、名称或特定年份、月份或日期等的文件进行排序、提取或分析将是一件非常简单的事情。