Bash
移動所有不以 .txt 結尾的文件
在目錄
/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 選項將使
bash
shell 啟用擴展的通配模式(!(*.txt)
以匹配所有不以 結尾的名稱.txt
),它啟用 glob 模式來匹配隱藏的名稱,如果沒有匹配項,它會使模式擴展為空。循環體將跳過任何目錄(或目錄的符號連結),並將其他所有內容移動到給定目錄。
find
和 GNU的等價物mv
(如果有的話,會將符號連結移動到目錄,並且mv
一次呼叫盡可能多的文件,但這些是唯一的區別):find ~username/data -maxdepth 1 ! -type d ! -name '*.txt' \ -exec mv -t ~username/data/other_files {} +
有關的: