mv 파일 | xargs


18

방금 / etc / apache / sites-enabled 폴더에서 다음과 같이 많은 파일 (심볼릭 링크 아님)을 / etc / apache / sites-available 폴더로 옮기려고합니다.

/etc/apache2/sites-enabled$ find . -maxdepth 1 -type f | xargs mv {} ../sites-available/

하지만 우분투 n00b 이고이 오류가 발생합니다.

mv: target `./real-file' is not a directory

여기서 '실제 파일'은 개발자 환경에서 설정 한 테스트 파일입니다. 프로덕션 서버에서 다른 사람의 혼란을 정리하려고합니다. ;-)

답변:


27

명령으로 -exec옵션을 시도해 볼 수 있습니다 find.

/etc/apache2/sites-enabled$ sudo find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \;

루트가 소유 한 파일을 이동하려면 sudo권한 이 필요합니다 .

xargs명령 을 사용하려면 -I옵션을 추가 하십시오.

find . -maxdepth 1 -type f | sudo xargs -I {} mv {} /etc/apache2/sites-available/

7

이상적으로는 find와 함께 -print0을 사용해야하므로 공백이있는 파일 이름은 문제를 일으키지 않습니다.

예를 들어, 이것이 작동합니다 :

find . -whatever-flags-go-here -print0 | xargs -r0 mv -t target-directory

0

다른 방법을 사용하여 동일하지만 추가 성능 을 수행 할 수 있습니다 .

find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \+

\+find 명령이 출력을 가져오고 {}원하는 작업 을 수행 하도록 확장하는 수단으로 끝납니다 .이 방법으로 두 가지 옵션을 피할 수 있습니다 ( \;= 각 항목마다 및 새 명령으로 파이핑 xargs)

여기에 설명이 있습니다 (매뉴얼을 확인할 수도 있습니다 man find)

-exec 명령 {} + -exec 조치의이 변형은 선택된 파일에서 지정된 명령을 실행하지만 명령 행은 선택한 각 파일 이름을 끝에 추가하여 빌드됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 명령 행은 xargs가 명령 행을 빌드하는 것과 거의 같은 방식으로 빌드됩니다. 명령 내에서 하나의 '{}'인스턴스 만 허용됩니다. 명령은 시작 디렉토리에서 실행됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.