Bash

移動所有不以 .txt 結尾的文件

  • January 2, 2019

在目錄/home/username/data中,我有文件和目錄。其中一些文件名以.txt(我將其稱為文本文件)結尾,而另一些則沒有。在子目錄中也會發生同樣的情況。

呼叫其中一個子目錄other_files(其完整路徑為/home/username/data/other_files/)。

我想移動所有不以to.txt 的根目錄 結尾的文件。/home/username/data``other_files


我可以用循環來做到這一點,但這不是我想要的。我想使用命令和管道。我相信這很容易,我只是沒有看到它。,和應該做的組合mv,我只是不知道怎麼做。find``grep``xargs

所以我一直在嘗試匹配文本文件(然後想辦法匹配除它們之外的所有內容)。在下文中,假設我的目前目錄是/home/username/data.

首先我選擇了find . | grep -E "*\.txt",但這匹配所有文本文件,包括子目錄中的文件。

所以我試著find . | grep -E "\./*\.txt"看看我是否會得到相同的比賽,然後朝著我的目標努力,但這與任何事情都不匹配,這就是我卡住的地方。


我該如何去做我在問題開頭描述的事情?

簡單的 shell 循環變體(在 中bash):

shopt -s extglob dotglob nullglob

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

在第一行設置的 shell 選項將使bashshell 啟用擴展的通配模式(!(*.txt)以匹配所有不以 結尾的名稱.txt),它啟用 glob 模式來匹配隱藏的名稱,如果沒有匹配項,它會使模式擴展為空。

循環體將跳過任何目錄(或目錄的符號連結),並將其他所有內容移動到給定目錄。

find和 GNU的等價物mv(如果有的話,會將符號連結移動到目錄,並且mv一次呼叫盡可能多的文件,但這些是唯一的區別):

find ~username/data -maxdepth 1 ! -type d ! -name '*.txt' \
   -exec mv -t ~username/data/other_files {} +

有關的:

引用自:https://unix.stackexchange.com/questions/492006