xargs를 사용하여 디렉토리에서 파일 이동

xargs를 사용하여 디렉토리에서 파일 이동

현재 디렉터리에서 일부 폴더를 검색 중입니다. 내가 원하는 것은 이 디렉터리의 모든 파일을 다른 디렉터리로 이동하는 것입니다. 다음 명령을 사용하고 있습니다.

find -maxdepth 1 -regex 'myRegexExpHere' | xargs -I file mv file/* Desktop/New\ folder/

그러나 예상대로 "*"는 xargs로 확장되지 않고 대신 모든 폴더에서 *라는 파일을 검색합니다. 목표를 달성하려면 어떻게 해야 합니까? (find의 -exec 스위치 대신) xargs만 사용하는 접근 방식을 제안해 주세요. 주로 xargs를 사용하는 것이 더 효율적이라고 읽었기 때문입니다.

답변1

file일치하는 파일 이름으로 대체된 후 실행되는 셸에서 와일드카드 확장을 수행해야 합니다. 따라서 에서 쉘을 시작해야 합니다 xargs.

xargsexec을 사용하는 것보다 술어를 사용하는 것이 더 좋습니다 find. 더 간단하고 인용 문제가 발생하지 않습니다.

find -maxdepth 1 -regex 'myRegexExpHere' -exec sh -c 'mv "$0"/* Desktop/New\ folder/' {} \;

일이 너무 복잡해질 수도 있습니다. 이 간단한 사용법은 find대부분의 쉘에서 직접 표현될 수 있습니다. Ksh에는 정규식 구문이 있습니다.

  • @(EXPR1|EXPR2)일치 EXPR1하거나EXPR2
  • *(EXPR)0개 이상의 일치 항목EXPR
  • +(EXPR)1개 이상 일치EXPR
  • ?(EXPR)0 또는 1번 일치EXPR

이 구문은 먼저 실행하면 bash에서도 작동하고 , 먼저 실행 shopt -s extglob하면 setopt ksh_globzsh에서도 작동합니다. 그런 다음 사용할 수 있습니다

mv REGEX/* Desktop/New\ folder/

답변2

find필요하지 않은데 왜 재귀를 사용합니까? 쉘을 사용한 정규식 일치(여기서는 Bash를 가정하고 필요에 맞게 수정하십시오):

for dir in */;do
    if [[ "$dir" =~ yourRegexHere ]];then
        mv -- "$dir"/* "Desktop/New folder/"
    fi
done

쉘의 정규식 기능이 요구 사항에 비해 너무 약한 경우 Perl보다 더 나은 것은 없습니다.

perl -e 'for(grep {/yourRegexHere/} glob "*/"){ 
             qx(mv -- "$_"/* "Desktop/New folder") 
         }'

관련 정보