중괄호 확장(정렬)과 함께 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

모든 입력 파일의 연결을 새 파일로 정렬합니다.

답변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

를 사용하면 이러한 파일이 다음 조건을 충족하는 경우에만 처리되도록 glob 한정자를 zsh추가할 수도 있습니다 ..정기적인문서. 를 사용하면 루프를 추가하여 비정규 파일을 건너뛸 bash수 있습니다 .[[ -f $f && ! -L $f ]] || continue

관련 정보