递归文件复制

递归文件复制

如何使用终端/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

这里有两个问题。

  1. 查找一组 jpeg 文件。
  2. 将一组文件复制到具有连续编号名称的目标目录。

对于第一个问题,显而易见且正确的解决方案是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可能无法匹配包含换行符的文件名。

相关内容