在一个目录中,我有数百个子目录。每个子目录有数百张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/ {} +
要首先测试它的功能,请替换cp
为echo cp
.
答案4
对于每个子目录中按数字顺序排列的第一个常规文件,zsh
您可以执行以下操作:
cp -- *(/e['reply=($REPLY/*(Nn.[1]))']) /path/to/destination/
对于最年长的人:
cp -- *(/e['reply=($REPLY/*(NOm.[1]))']) /path/to/destination/