mv 命令:仅移动某些扩展文件,其名称中不包含字符串

mv 命令:仅移动某些扩展文件,其名称中不包含字符串

我正在尝试将“mv”命令合并到dockerfile中。

我只想移动那些具有特定扩展名但名称中不包含字符串的文件。

假设 src 目录中有 abc.txt、abcu.txt、def.xml、1abc2.txt、mno.txt、pqr.txt,而我只想移动 .txt 文件,并且文件名称中不包含“abc”。因此,只有 mno.txt 和 pqr.txt 需要移动。

最佳做法是什么?

答案1

使用扩展的 shell 通配符:

$ ls *.txt
1abc2.txt  abc.txt  abcu.txt  mno.txt  pqr.txt
$
# Enable extended shell globbing
$ shopt -s extglob
$
# "echo" is for a dry-run
$ echo mv -nv -t /path/to/dest -- !(*abc*).txt
mv -nv -t /path/to/dest -- mno.txt pqr.txt
$
# Disable extended shell globbing
$ shopt -u extglob

find

$ find ! -name "*abc*" -name "*.txt" -exec echo mv -nv -t /path/to/dest -- {} +
mv -nv -t /path/to/dest -- ./mno.txt ./pqr.txt

通告

  1. echomv在上面两个例子中,为了进行安全的试运行,将其添加到了前面...当对输出满意时,您需要将其删除,这样实际的移动才会发生。
  2. 选项-t指定mv目标/目标目录,并且它期望在它之后以路径形式带有一个参数,如-t /path/to/dest
  3. 如果您需要指定包含第一个示例中的文件的源目录的路径,那么它需要位于--glob 模式之后和之前,例如mv -nv -t /path/to/dest -- /path/to/source/!(*abc*).txt...而在第二个示例中,可以这样做find /path/to/source/ ! -name "*abc*" -name "*.txt" -exec echo mv -nv -t /path/to/dest -- {} +
  4. 命令后的第一个 shell 通配符示例mv受制于系统允许的命令的最大参数长度/大小,虽然在 Ubuntu 上应该相当大(我上次检查时,它大约有 2 MB),但无论如何您都需要知道...find但是,第二个示例不受此限制的影响。

相关内容