Shell 脚本:将多个文件夹中的第一个文件复制到一个文件夹中

Shell 脚本:将多个文件夹中的第一个文件复制到一个文件夹中

在一个目录中,我有数百个子目录。每个子目录有数百张jpg图片。如果文件夹名为“ABC_DEF”,则该文件夹内的文件将被称为“ABC_DEF-001.jpg”、“ABC_DEF-002.jpg”,依此类推。

例如:

---Main Directory
------Sub-Directory ABC_DEF
----------ABC_DEF-001.jpg
----------ABC_DEF-002.jpg
------Sub-Directory ABC_GHI
----------ABC_GHI-001.jpg
----------ABC_GHI-002.jpg

我只想将每个子目录中的第一个文件(例如扩展名为 -001.jpg 的文件)复制到名为 DESTDIR 的公共目标文件夹。

我已经更改了给出的代码这里以适合我的用例。但是,它总是打印第一个目录以及文件名,并且我无法将文件复制到所需的目的地。以下是代码:

DIR=/var/www/html/beeinfo.org/resources/videos/
find "$DIR" -type d |
while read d;
do
    files=$(ls -t "$d" | sed -n '1h; $ { s/\n/,/g; p }')
    printf '%s,%s\n' "$files";
done

我该如何修复此代码?

答案1

为什么find所有文件都位于相同深度的目录中?

cd -- "$DIR" &&
  cp -- */*-001.jpg /destination/path

答案2

find仅当您应该选择第一个以-001.jpg模式结尾的文件并且每个子目录中只有一个文件时,这才很容易做到,因此命令为:

find . -name "*-001.jpg" -execdir echo cp -v {} /path/to/dest/ \;

笔记echo一旦结果符合您的预期,请删除进行试运行。

答案3

您可以使用find -exec {} +来获取文件列表并cp仅调用一次:

find /path/to/main/dir -name "*-001.jpg" -exec cp -t /path/to/dest/dir/ {} +

要首先测试它的功能,请替换cpecho cp.

答案4

对于每个子目录中按数字顺序排列的第一个常规文件,zsh您可以执行以下操作:

cp -- *(/e['reply=($REPLY/*(Nn.[1]))']) /path/to/destination/

对于最年长的人:

cp -- *(/e['reply=($REPLY/*(NOm.[1]))']) /path/to/destination/

相关内容