如何使用终端/Linux 命令递归搜索驱动器中的图像 (jpg) 并将其复制到我的桌面,并使用数字重命名所有找到的文件。因此,它找到的第一个文件应复制到桌面,文件名为 1.jpg,第二个文件应复制为 2.jpg,第 50,000 个文件应复制为 50000.jpg,依此类推。
答案1
n=1; for file in $(find /media/foo/ -name '*.jpg'); do cp $file ~/Desktop/$n.jpg; n=$((n + 1)); done
答案2
这里有两个问题。
- 查找一组 jpeg 文件。
- 将一组文件复制到具有连续编号名称的目标目录。
对于第一个问题,显而易见且正确的解决方案是find
,幸运的是,这使得这个问题变得非常容易。
find / -type f -iregex '.*\.jpe?g$'
当然,如果您想使用file
而不是通过扩展来进行类型检测,这可以变得更加复杂。
第二个问题是顺序复制。只需一个简单的计数器即可完成此操作。
n=1
cp "$source" "$dest/$n.jpeg"
n=$((n + 1 ))
当然,这是在循环内执行的,$source
每次迭代都会发生变化。
综合起来
#!/usr/bin/env bash
usage() {
echo "$0: usage: $0 [source directory] [destination directory]"
}
if [ ${#@} -ne 2 ] ; then
usage
exit
fi
scan="$1"
dest="$2"
if [ ! -d "$scan" ] ; then
usage
printf "\nspecified source does not exist or is not a directory\n"
exit
fi
if [ ! -d "$dest" ] ; then
usage
printf "\nspecified destination does not exist or is not a directory\n"
exit
fi
n=1
while read -r -d $'\0' source ; do
cp "$source" "$dest/$n.jpeg"
n=$((n + 1 ))
done < <(find "$scan" -type f -regextype posix-extended -iregex '.*\.jpe?g$' -print0)
可移植性注意事项:-regextype
是 GNU 查找扩展;没有它-iregex
可能无法匹配包含换行符的文件名。