Bash

刪除未命名為“today.md”的文件

  • October 31, 2018

我在工作目錄中有一系列降價文件:

$ ls *.md
csv_reader.md  egrep.md  find.md  found_pdfs.md  osPathSep_help.md  readme.md  smtplib_help.md  today.md

我想刪除它們,除了“today.md”

#!/usr/local/bin/bash
for i in ./*.md ; do
   if [[ $i != "today.md" ]]; then
       echo $i
   fi
done

執行它並得到

$ bash bash/remove_files.sh
./csv_reader.md
./egrep.md
./find.md
./found_pdfs.md
./osPathSep_help.md
./readme.md
./smtplib_help.md
./today.md

儘管如此,結構化命令在命令行中並不方便,我怎麼能用較短的命令完成這樣的任務

使用否定匹配(需要shopt -s extglob,但可能已經設置):

rm !(today).md

(您可以先使用ls而不是rm檢查結果)。

強大的力量extglob,你也可以

rm !(yesterday|today).md

如果您想保留兩個文件。

find . -maxdepth 1 -name '*.md' ! -name today.md -type f -print

應該只找到-type f目前目錄中的所有文件()(.–或顯式放一個目錄名)(-maxdepth 1防止後面的子目錄.md)以( )結尾-name '*.md',不包括(!)文件today.md

一定要包含單引號,'*.md'這樣你的 shell 在執行之前不會嘗試將其擴展為目前目錄中的 .md 文件列表find

它將列印要刪除的文件列表。改為-print刪除-delete它們。

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