我想将当前目录中的所有文件移动到以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/