如何将 Bash 通配符与大括号扩展(排序)结合使用?

如何将 Bash 通配符与大括号扩展(排序)结合使用?

我用来sort从文本文件中删除重复行,按字母顺序排序,覆盖文件{,}在命令中):

sort -u -o $HOME/Documents/notes/URLs.txt{,}

之后如何添加其他文件到混合中URLs.txt?再用另外三个来说明:

$HOME/Documents/notes/{URLs.txt,Android.txt,mpv.txt,firefox.txt}

答案1

sort对所有输入进行排序。因此,只要我们向 提供多个文件参数sort,我们就会对它们的串联进行排序。要单独对文件进行排序并使用输出重写每个文件,您必须调用单独的命令。

for f in URLs.txt Android.txt mpv.txt firefox.txt
do
    sort -u -o "$HOME/Documents/notes/$f"{,}
done

而这个:

sort -u -o newfile "$HOME"/Documents/notes/*.txt

会将所有输入文件的串联排序到 newfile。

答案2

在 中zsh,我会这样做:

for f (~/Documents/notes/(URLs|Android|mpv|firefox).txt(N)) sort -uo $f $f

(或者sort -uo $f{,}如果你想打高尔夫球)。

等效bash的看起来像:

(shopt -s extglob nullglob
  for f in ~/Documents/notes/@(URLs|Android|mpv|firefox).txt; do
    sort -uo "$f" "$f"
  done
)

那些使用通配符而不是大括号扩展的人,因此只会处理那些URLs.txt......firefox.txt如果它们确实存在的话。

使用zsh,您还可以添加.glob 限定符,以便仅在这些文件满足以下条件时才处理这些文件:常规的文件。使用bash,您可以添加[[ -f $f && ! -L $f ]] || continue循环来跳过非常规文件。

相关内容