我有数千个目录,每个目录中都有一个子目录,其中有一个名为file.jpg
.由于每个子目录都有一个名为的文件,因此file.jpg
我无法将所有这些文件传输到同一个文件夹中,或者它们只是相互覆盖,直到最后一个(一个)file.jpg
剩下。
相反,我想将一些命令粘贴到终端中以执行以下操作:
- 复制到“审阅”文件夹后,
{number}
为每个内容添加。file.jpg
注意:可能有数千个文件,因此停止位置应该没有限制。file34634657.jpg
例如,最后一个文件可以是。
附带问题:是否有任何方法可以追溯到复制file{number}.jpg
到其原始目录/子目录?这些file.jpg
目录包含可能需要检查的其他子目录和文件。
答案1
如果添加数字不是强制性要求,您可以在文件名中添加路径。这样您就可以解决两个“问题”(覆盖文件并且无法追溯)。
for ef in $(find * -name file.jpg); do cp $ef /path/to/dest_dir/$(echo $ef | sed 's,/,--,g'); done
- find *
-*
要删除./
文件的开头,
- $(echo $ef | sed 's,/,--,g')
- 使用 sed 更改/
为--
(使用此命令您将能够追溯,或者您可以使用更具体的内容来代替--
)。
编辑(由于下面的OP注释):
如果您的目录包含空白/空格,请更改您的IFS(内部字段分隔符)。
如果需要,您可以备份当前的备份并在命令结束时恢复它。
old_IFS=$IFS; IFS=$'\n'; for ef in $(find * -name file.jpg); do cp $ef dest_dir/$(echo $ef | sed 's,/,--,g;s/ /_/g'); done; IFS=$old_IFS
old_IFS=$IFS
- 备份当前的 IFS(默认情况下为 、space
和tab
)newline
,IFS=$'\n'
- 将 IFS 设置为newline
(仅newline
)以避免分词space
,IFS=$old_IFS
- 将 IFS 恢复为其默认值。
当然,s/ /_/g
如果您希望文件(在目标位置)包含目录中的空格,您可以删除第二个 sed 脚本并只保留一个(第一个)。