파일이 발견된 곳에서 명령을 어떻게 실행할 수 있나요? 다음 내용으로
이름이 지정된 디렉터리가 있다고 가정해 보겠습니다 .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
해당 디렉토리에서 발견된 s의 수에 관계없이 각 디렉토리에서:
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)
추가로 수정자와 한정자를 확장자로 결합 .bkp
하고 고유한 디렉터리 이름을 배열에 저장할 수 있습니다.
dirlist=(**/*.bkp(D.:a:h))
답변4
다음을 입력하세요.
https://bitbucket.org/eradman/entr
당신이 할 수 있는 일은 entr가 지정된 디렉토리를 감시하도록 하는 것입니다. find가 파일을 찾으면 해당 디렉토리에서 "triggerfile.txt"라는 파일을 터치하고 enter가 인계받도록 합니다.