移动所有不以 .txt 结尾的文件

Mov*_*Man 10 grep bash find xargs filenames

在目录中,/home/username/data我有文件和目录。这些文件名中的一些以.txt(我将其称为文本文件)结尾,其他的则没有。在子目录中也会发生同样的情况。

调用子目录之一other_files(其完整路径为/home/username/data/other_files/)。

我想移动所有不以to.txt 的根 结尾的文件。/home/username/dataother_files


我可以用循环来做,但这不是我想要的。我想使用命令和管道。我相信这很容易,只是我没有看到。mv, find,grep和 的组合xargs应该这样做,我只是不确定如何。

所以我一直在尝试匹配文本文件(然后想办法匹配除它们之外的所有内容)。在下面,假设我当前的目录是/home/username/data.
首先我选择了find . | grep -E "*\.txt",但这匹配所有文本文件,包括子目录中的文件。
所以我find . | grep -E "\./*\.txt"只是想看看我是否会得到相同的比赛然后朝着我的目标努力,但这并不匹配任何东西,这就是我被卡住的地方。


我该如何去做我在问题开头所描述的事情?

Kus*_*nda 13

简单的 shell 循环变体(in bash):

shopt -s extglob dotglob nullglob

for pathname in ~username/data/!(*.txt); do
    ! test -d "$pathname" && mv "$pathname" ~username/data/other_files
done
Run Code Online (Sandbox Code Playgroud)

在第一行设置的 shell 选项将使bashshell 启用扩展的 globbing 模式(!(*.txt)匹配所有不以 结尾的名称.txt),它启用 glob 模式来匹配隐藏的名称,如果没有任何匹配,它会使模式扩展为任何内容。

循环体将跳过目录(或目录的符号链接)的任何内容,并将其他所有内容移动到给定目录。

find和 GNU等价的东西mv(如果有的话,会将符号链接移动到目录,并且一次调用mv尽可能多的文件,但这些是唯一的区别):

find ~username/data -maxdepth 1 ! -type d ! -name '*.txt' \
    -exec mv -t ~username/data/other_files {} +
Run Code Online (Sandbox Code Playgroud)

有关的:


noh*_*ide 7

find /home/username/data -maxdepth 1 -type f ! -name '*.txt' -exec mv {} /home/username/data/other_files/ \;
Run Code Online (Sandbox Code Playgroud)
  • 对顶级董事的最大深度限制
  • type 确保只找到文件,而不是目录

  • 你最好使用 `-type f` 否则它会尝试移动 `other_files` 以及我们不知道的任何其他 `data` 子目录。 (2认同)