2012-11-05 2 views
6

다른 명령의 매개 변수로 명령 요소의 출력 목록을 전달하고 싶습니다. 나는 다른 페이지를 발견 :다른 명령의 매개 변수로 Linux 명령 출력

하지만 그들은 더 복잡한 것 같다.

Linux find 명령을 호출 한 모든 결과에 파일을 복사하고 싶습니다.

여기에 잘못?

find . -name myFile 2>&1 | cp /home/myuser/myFile $1 

감사

답변

16

이 당신이 원하는 무엇인가 :이의

find . -name myFile -exec cp /home/myuser/myFile {} ';' 

고장/설명 :

  • find : 현재 작업 디렉토리에서 검색을 시작 : find 명령
  • .를 호출. 명시 적 이름 myFile
  • -exec 사용하여 파일을 찾을 : 더 깊이 플래그를 지정하지 않기 때문에
  • ,이 모든 하위 폴더
  • -name myFile에 대한 재귀 적으로 검색합니다 검색 결과,
  • cp /home/myuser/myFile {} 그들과 함께 추가 명령을 수행 사본을 에 의해 반환 된 각 결과를 덮어 쓰려면; {}을 각 검색 결과의 위치와 같이 생각하십시오.
  • ';'
  • : find
+0

/home/myuser/myFile 뒤에 {}의 순서를 두 번째 위치로 변경하면됩니다. 감사. –

+0

@ LuisAndrésGarcía, 아, 내가 잘못 생각한 것일 수도 있습니다 - 하나의 파일'/ home/myuser/myFile'을 복사하여 cwd에서'find'에 의해 발견 된'myFile'을 덮어 쓰시겠습니까? –

+0

당신이 맞습니다! :) 찾은 파일의 속성을 나열하는 또 다른 예는 다음과 같습니다. find -exec ls -l {} ';' –

2

무엇 파이프는 다른 사람의 입력에 하나 개의 프로그램의 출력을 보내드립니다. cp은 터미널에서 입력 스트림을 읽지 않으며 단순히 명령 줄에서 인수를 사용합니다.

파이프 대신 xargs을 사용하거나 파이프 대신 findexec 인수를 사용하려고합니다.

+2

당신이 예를 줄 수 제발? 고맙습니다. –

3

당신이 이름에 공백이나 특수 문자가있는 파일에 대해 걱정할 필요가 있는지 여부에 따라이 문제를 해결하기 위해 몇 가지 방법이 있습니다 후 다른 명령을 구분하는 데 사용 실행합니다.

공백이나 특수 문자가없는 파일 이름 (문자, 숫자, 대시 및 밑줄만으로 구성)이없는 경우 다음은 간단한 해결책입니다. $(command)을 사용하여 명령을 실행하고 결과를 다른 명령의 인수로 대체 할 수 있습니다. 쉘은 결과를 공백, 탭 또는 개행 문자로 분할하고 for을 차례로 각 값을 $f에 할당하고 각 값에 대해 명령을 실행합니다.

for f in $(find . -name myFile) 
do 
    cp something $f 
done 

당신은 공백이나 탭이있는 경우, 당신은 발견의 -exec 옵션을 사용할 수 있습니다. -exec command args을 전달하고 {}을 파일명을 대체 할 위치로두고 인수를 ;으로 끝내십시오. 쉘이 해석하지 않도록 {};을 인용해야합니다.

때로는 -exec은 충분하지 않습니다. 예를 들어, this question에서 Bash 매개 변수 확장을 사용하여 파일 이름을 계산하려고했습니다. 이를 수행하려면 -exec bash -c 'your command'을 전달해야하지만 {} 대체와 함께 인용문 문제가 발생합니다. 이 문제를 해결하려면 (파일 이름에 유효하지 않은) 널 (null) 문자로 구분 된 결과를 인쇄 할 find에서 -print0을 사용할 수 있으며, 관이 널 (null)에 매개 변수를 분할하는 while read 루프 :

find . -name myFile -print0 | (while read -d $'\0' f; do 
    cp something "$f" 
    done) 
관련 문제