파일이 발견된 명령을 실행하십시오.

파일이 발견된 명령을 실행하십시오.

파일이 발견된 곳에서 명령을 어떻게 실행할 수 있나요? 다음 내용으로
이름이 지정된 디렉터리가 있다고 가정해 보겠습니다 .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가 인계받도록 합니다.

관련 정보