删除未命名为“today.md”的文件

Abs*_*cDo 7 bash shell-script rm files

我在工作目录中有一系列 Markdown 文件:

$ ls *.md
csv_reader.md  egrep.md  find.md  found_pdfs.md  osPathSep_help.md  readme.md  smtplib_help.md  today.md
Run Code Online (Sandbox Code Playgroud)

我想删除它们,除了“today.md”

#!/usr/local/bin/bash
for i in ./*.md ; do
    if [[ $i != "today.md" ]]; then
        echo $i
    fi
done
Run Code Online (Sandbox Code Playgroud)

运行它并得到

$ 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
Run Code Online (Sandbox Code Playgroud)

尽管如此,结构化命令在命令行中并不方便,我怎么能用较短的命令完成这样的任务

xen*_*oid 19

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

rm !(today).md
Run Code Online (Sandbox Code Playgroud)

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

强大的力量extglob,你也可以做到

rm !(yesterday|today).md
Run Code Online (Sandbox Code Playgroud)

如果你想节省两个文件。


小智 12

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删除它们来代替。


use*_*145 9

以上是更好的解决方案,但您的代码不起作用的原因是因为比较。

“./today.md”不等于“today.md”。