![xargs 내에 중첩된 명령](https://linux55.com/image/217309/xargs%20%EB%82%B4%EC%97%90%20%EC%A4%91%EC%B2%A9%EB%90%9C%20%EB%AA%85%EB%A0%B9.png)
파일 폴더 폴더가 있습니다. 모든 파일을 상위 파일로 복사하려고 합니다. 다음 명령은 dirname "{}"
find 명령보다 먼저 실행되므로 작동하지 않습니다. 무엇을 할 수 있나요?
find . -name "*" -type f | xargs -I "{}" cp "{}" `dirname "{}"`
답변1
현재 작업 디렉터리에서 디렉터리 트리 아래의 모든 파일을 각 파일의 상위 디렉터리로 이동하려면 break xargs
또는 dirname
을 find
수행할 필요조차 없습니다.
$ tree
.
+--- dir1
| +--- somefile
+--- dir2
| +--- someotherfile
$ find . -type f -execdir mv "{}" ../ \;
$ tree
.
+--- dir1
+--- dir2
+--- somefile
+--- someotherfile
execdir
for 옵션은 find
일치하는 각 파일이 있는 디렉터리에서 지정된 명령을 실행합니다.
답변2
DopeGhoti의 XY 문제를 해결하는 것 외에도 실제 문제에 대한 답변을 제공하고 싶습니다. IMHO가 알아두면 좋은 점은 다음과 같습니다. cp 명령을 다른 쉘로 묶습니다.
find . -type f | xargs -I "{}" sh -c 'cp "{}" `dirname "{}"`'
이것이 작동하지 않기 때문에(cp 명령은 파일을 이미 있는 디렉토리에 복사하려고 시도하기 때문에 다음과 같이 /..를 추가해야 합니다:
find . -type f | xargs -I "{}" sh -c 'cp "{}" `dirname "{}"`/..'