디렉토리에서 "ls -R"을 실행하면 다음과 같은 결과가 나타납니다.
./dir1
dir2 file1.txt file2.txt
./dir1/dir2
file3.txt file4.txt
하지만 나는 나에게 주어진 명령을 원한다
./dir1/file1.txt
./dir1/file2.txt
./dir1/dir2/file3.txt
./dir1/dir2/file4.txt
이렇게 하면 for 루프에서 모든 파일을 처리하는 데 사용할 수 있습니다.
답변1
당신이 원하는find(1)
. 이것은 정확히 당신이 원하는 것을 할 것입니다. 파일 유형(디렉토리 제외), 지정된 파일보다 최신의 타임스탬프 등과 같은 다양한 필터 기준을 지정할 수도 있습니다. 매뉴얼 페이지에서는 이러한 조건을 더 자세히 설명합니다.
또한 이 옵션을 살펴보세요 -exec
. 출력을 반복하는 대신 사용할 수도 있습니다.
답변2
bash ≥4 또는 zsh 또는 ksh93 ≥o+ 1 을 사용하는 경우 쉘이 재귀적 와일드카드를 수행하도록 할 수 있습니다. **/
와일드카드는 임의 깊이의 디렉터리와 일치합니다. Bash에서는 (bash)를 사용하여 이 기능을 활성화해야 하며 shopt -s globstar
, bash 4.2 및 이전 버전은 **/
디렉터리에 대한 기호 링크를 통과한다는 점에 유의하세요. ksh93에서는 set -o globstar
(ksh93)이 필요하며 zsh에서는 항상 활성화되어 있습니다.
for x in **/*.txt; do …
스크립트를 다른 쉘로 이식해야 하는 경우,find
명령 사용, 이는 작업에 딱 맞는 도구입니다. 이는 find
두 가지 방식으로 작동하는 외부 명령입니다. 즉, 파일 목록을 생성하고 각 파일에 대해 명령을 실행할 수 있습니다. 각 파일에서 명령을 실행하려면 다음을 사용하십시오 -exec
.
find . -type f -name '*.txt' -exec chmod a+r {} +
1 Bourne 쉘이 아닌 경우 다음 기능 fish
도 사용할 수 있습니다.tcsh
답변3
tree
또한 훌륭한 도구입니다.
나는 사용한다
tree -Dpushfag --du
예를 들어 최대 2개 수준까지 깊이 제한을 추가할 수도 있습니다.
tree -Dpushfag --du -L 2