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
.
find
-exec
각 결과에 대해 수행할 작업을 지정할 수 있는 옵션이 있습니다 . 각 찾기 결과를 사용할 수 있게 만들고{}
필요에 따라 수정할 수 있습니다. 매개변수(예: )를 제공하려는 경우echo foo > file
상황이 좀 더 복잡해집니다 . 이렇게 하려면 find에exec
쉘을 실행하라고 지시해야 합니다. 따라서foo
발견된 모든 파일을 에코하려면 다음을 실행할 수 있습니다.find /etc/ -name abc.txt -path "/etc/zyz*" \ -exec bash -c "echo 'New line data' >> {}" \;
쉘 와일드카드. 일부 쉘(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