user598527 Asked: 2022-05-13 00:42:31 +0800 CST2022-05-13 00:42:31 +0800 CST 2022-05-13 00:42:31 +0800 CST 如何结合使用 Bash globbing 和大括号扩展(排序)? 772 我用来sort从文本文件中删除重复的行,按字母顺序排序,覆盖文件({,}在命令中): sort -u -o $HOME/Documents/notes/URLs.txt{,} 之后如何添加其他文件URLs.txt?用另外三个来说明: $HOME/Documents/notes/{URLs.txt,Android.txt,mpv.txt,firefox.txt} bash sort 2 个回答 Voted Best Answer thanasisp 2022-05-13T01:02:02+08:002022-05-13T01:02:02+08:00 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。 Stéphane Chazelas 2022-05-13T01:09:03+08:002022-05-13T01:09:03+08:00 在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 ) 那些使用 globbing 而不是大括号扩展的人,所以只会处理那些URLs.txt......firefox.txt如果它们确实存在的话。 使用zsh,您还可以添加.glob 限定符,以便这些文件仅在它们是常规文件时才被处理。使用bash,您可以[[ -f $f && ! -L $f ]] || continue在循环中添加以跳过非常规文件。
sort
正在对所有输入进行排序。因此,每当我们向 提供多个文件参数时sort
,我们都会对它们的串联进行排序。要单独对文件进行排序并使用输出重写每个文件,您必须调用单独的命令。而这:
会将所有输入文件的串联排序到 newfile。
在
zsh
中,我会这样做:(或者
sort -uo $f{,}
如果你想打高尔夫球)。bash
等效项如下所示:那些使用 globbing 而不是大括号扩展的人,所以只会处理那些
URLs.txt
......firefox.txt
如果它们确实存在的话。使用
zsh
,您还可以添加.
glob 限定符,以便这些文件仅在它们是常规文件时才被处理。使用bash
,您可以[[ -f $f && ! -L $f ]] || continue
在循环中添加以跳过非常规文件。