파일이 발견된 위치에서 명령 실행

파일이 발견된 위치에서 명령 실행

파일이 발견된 경우 명령을 어떻게 실행합니까? 다음을 포함하는
디렉터리가 있다고 가정해 보겠습니다 .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가 인계받도록 합니다.

관련 정보