移动除与文件名匹配的文件之外的所有文件

use*_*940 3 find mv

我想将当前目录中的所有文件移动到以NewDir. 结尾的目录中*.bam,但名为special.file.bam.

我发现这个命令可以删除所有文件,但不知道如何移动它们,而不是删除它们:

find . ! -name 'special.file.bam' -type f -exec rm -f {} +
Run Code Online (Sandbox Code Playgroud)

αғs*_*нιη 7

如果你的 shell 是 bash shell,你可以简单地通过启用扩展 Glob 执行以下操作:

shopt -s extglob
mv -- !(special.file).bam temp/
Run Code Online (Sandbox Code Playgroud)

要抑制错误:" bash: /usr/bin/mv: Argument list too long" 当匹配给定模式的文件太多时,请执行以下操作:

for file in !(special.file).bam; do
    mv -- "$file" temp/
done
Run Code Online (Sandbox Code Playgroud)

或者使用find命令代替和可移植性:

find . -path './*' -prune -type f -name '*.bam' ! -name 'special.file.bam' \
    -exec sh -c 'for file; do mv "$file" temp/; done' sh_mv {} +
Run Code Online (Sandbox Code Playgroud)

删除-path './*' -prune部分以查找子目录中的文件。