하나의 명령으로 서로 다른 폴더에 있는 여러 파일을 수정하시겠습니까?

하나의 명령으로 서로 다른 폴더에 있는 여러 파일을 수정하시겠습니까?

abc.txt내 폴더 /etc/zyz/와 여러 하위 폴더 에 파일이 있습니다./etc/zyz-1/ /etc/zyz-2/

echo명령을 사용하여 폴더에 있는 모든 파일(모두 이름이 지정됨)을 수정하려면 어떻게 해야 합니까 ? 일부 시스템에는 폴더가 2개만 있고 다른 시스템에는 10개가 넘는 폴더가 있습니다.abc.txt/etc/zyz

내가 실행하고 싶은 명령의 예

echo 'New line data' >> abc.txt

abc.txt < /dev/null

답변1

다음 트리가 주어졌을 때(비어 있는 abc.txt):

.
├── zyz
│   └── abc.txt
├── zyz-1
│   └── abc.txt
└── zyz-2
    └── abc.txt

다음 명령을 사용하여 모든 abc 파일을 나열할 수 있습니다.

$ echo zyz*/abc.txt
  zyz-1/abc.txt zyz-2/abc.txt zyz/abc.txt

tee -a이러한 모든 파일에 일부 입력 스트림을 동시에 추가 할 수 있습니다 .

$ echo 'New line data' | tee -a zyz*/abc.txt
  New line data

두 번 실행하면 각 abc.txt에 두 줄이 포함됩니다.

$ cat zyz/abc.txt
  New line data
  New line data
$ cat zyz-1/abc.txt
  New line data
  New line data
$ # ...

이를 지우려면 다음을 수행할 수 있습니다.

$ </dev/null tee zyz*/abc.txt

또는

$ : | tee zyz*/abc.txt

find -exec(짧은 이름을 가진 파일 몇 개만으로 ARG_MAX 제한에 도달해서는 안 되지만 내 양식에 사용한 파일 수가 너무 많아야 합니다 +(맨페이지 참조).)

답변2

두 가지 일반적인 방법, 즉 쉘 와일드카드가 있습니다 find.

  1. find-exec각 결과에 대해 수행할 작업을 지정할 수 있는 옵션이 있습니다 . 각 찾기 결과를 사용할 수 있게 만들고 {}필요에 따라 수정할 수 있습니다. 매개변수(예: )를 제공하려는 경우 echo foo > file상황이 좀 더 복잡해집니다 . 이렇게 하려면 find에 exec쉘을 실행하라고 지시해야 합니다. 따라서 foo발견된 모든 파일을 에코하려면 다음을 실행할 수 있습니다.

    find /etc/ -name abc.txt -path "/etc/zyz*" \
        -exec bash -c "echo 'New line data' >> {}" \;
    
  2. 쉘 와일드카드. 일부 쉘(bash, zsh 및 ksh)은 재귀 와일드카드를 처리할 수 있습니다. Bash에서는 shopt globstar. 따라서 New line data각 파일을 에코하려면 다음을 실행합니다.

    shopt globstar
    for f in /etc/zyz*/**/abc.txt; do echo "New line data" >> "$f"; done
    

관련 정보