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

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

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

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

find . ! -name 'special.file.bam' -type f -exec rm -f {} +

答案1

如果您的 shell 是 bash shell,则只需启用扩展全局变量即可执行以下操作:

shopt -s extglob
mv -- !(special.file).bam temp/

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

for file in !(special.file).bam; do
    mv -- "$file" temp/
done

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

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

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

答案2

 find . -maxdepth 1 -type f -name "*.bam" ! -name "special.file.bam" -exec mv {} NewDir \;

答案3

如果文件数量超过命令行长度,您仍然需要使用find.我建议将其与xargs空分隔文件 ( \0) 结合使用,例如:

find . -maxdepth 1 -type f -name '*.bam' ! -name 'special.file.bam' -print0 |
xargs -0 mv -t /path/to/destination

注意:未经过详尽测试,请谨慎使用。

答案4

mv -f $(find ./*.bam -maxdepth 1 ! -name "special.file.bam" -type f) NewDir/ 

相关内容