
파일이 발견된 경우 명령을 어떻게 실행합니까? 다음을 포함하는
디렉터리가 있다고 가정해 보겠습니다 .testdir
$ ls -R testdir/
testdir/:
dir1 dir2 dir3 dir4 dir5
testdir/dir1:
doc1.pdf
testdir/dir2:
file1.txt
testdir/dir3:
doc2.pdf
testdir/dir4:
file2.txt
testdir/dir5:
doc5.pdf
find
이제 특정 파일/파일 형식을 찾는 작업(명령 실행)을 수행하고 싶습니다 . 예를 들어 다음을 찾아보겠습니다 *.pdf
.
$ find . -name '*.pdf'
./testdir/dir3/doc2.pdf
./testdir/dir5/doc5.pdf
./testdir/dir1/doc1.pdf
touch file
이제 위의 명령이 파일을 찾는 명령(예: )을 실행한다고 가정합니다 . 즉, file
적어도 하나가 .pdf
발견된 각 디렉토리에 이름이 지정된 파일을 생성하여 다음을 얻습니다.
$ ls -R testdir/
testdir/:
dir1 dir2 dir3 dir4 dir5
testdir/dir1:
doc1.pdf file
testdir/dir2:
file1.txt
testdir/dir3:
doc2.pdf file
testdir/dir4:
file2.txt
testdir/dir5:
doc5.pdf file
어떻게 그런 일을 완수할 수 있나요?
파일이 발견될 때마다 cd
파일이 존재하는 위치로 이동하여 재귀적으로 명령을 수행할 수 있습니다.
나는 그것이 find
멋진 기능을 가지고 있다는 것을 알고 있습니다. -exec
그러나 그것을 작동시킬 수는 없습니다.
이것은 내가 하고 싶은 일에 대한 아이디어를 얻기 위한 예시일 뿐입니다. 광범위하게: 파일이 반복적으로 발견되는 명령을 실행하는 방법은 무엇입니까 find
?
답변1
이 명령을 실행하면 touch file
명령이 시작된 디렉터리에서 여러 번 실행될 수 있습니다.
find -name '*.pdf' -exec touch file \;
반면에 이 변형을 실행하면 명령의 각 인스턴스가 대상 파일의 디렉터리에서 실행됩니다.
find -name '*.pdf' -execdir touch file \;
두 경우 모두 를 및/또는 touch file
으로 대체하여 실제로 이를 확인할 수 있습니다 .echo {}
pwd
맨페이지에서:
-execdir command ;
-execdir command {} +
와 유사
-exec
하지만 지정된 명령은 일치하는 파일이 포함된 하위 디렉터리에서 실행됩니다. 이 하위 디렉터리는 일반적으로 를 시작한 디렉터리가 아닙니다find
.
답변2
다음과 같이 파일 이름의 디렉토리를 추출하여 dirname
거기에서 가져올 수 있습니다.
find . -name "*.pdf" -type f -exec bash myscript {} \;
파일에는 myscript
다음이 포함되어 있습니다.
dir=$(dirname "$1")
cd "$dir"
touch file
답변3
예를 들어 , 파일 zsh
만 선택하고 다음을 통해 glob 한정자를 사용할 수 있습니다..pdf
수정자다음을 사용하여 디렉토리 이름을 배열에 저장하십시오.고유한요소를 선택한 다음 cd
각 디렉토리에 추가하고 명령을 실행하세요. 이 방법으로 명령만 실행하면 됩니다.한 번.pdf
해당 디렉토리에서 발견된 의 수에 관계없이 각 디렉토리에 :
dirlist=(**/*.pdf(.:a:h))
for d in ${(u)dirlist[@]}
(cd $d && touch file)
또는
typeset -U dirlist
dirlist=(**/*.pdf(.:a:h))
for d in ${dirlist}
(cd $d && touch file)
추가로 수정자와 한정자를 결합할 수 있습니다(예: 확장자를 사용하여 일반 파일(숨김 및 숨김 아님)에 대한 glob에 사용 .bkp
하고 고유한 디렉터리 이름을 배열에 저장할 수 있습니다.
dirlist=(**/*.bkp(D.:a:h))
답변4
Enter보다 더 이상 보지 마십시오.
https://bitbucket.org/eradman/entr
당신이 할 수 있는 일은 entr이 지정된 디렉토리를 감시하도록 하는 것입니다. find가 파일을 찾으면 해당 디렉토리에서 Triggerfile.txt라는 파일을 터치하고 Enter가 인계받도록 합니다.