현재 디렉터리에서 일부 폴더를 검색 중입니다. 내가 원하는 것은 이 디렉터리의 모든 파일을 다른 디렉터리로 이동하는 것입니다. 다음 명령을 사용하고 있습니다.
find -maxdepth 1 -regex 'myRegexExpHere' | xargs -I file mv file/* Desktop/New\ folder/
그러나 예상대로 "*"는 xargs로 확장되지 않고 대신 모든 폴더에서 *라는 파일을 검색합니다. 목표를 달성하려면 어떻게 해야 합니까? (find의 -exec 스위치 대신) xargs만 사용하는 접근 방식을 제안해 주세요. 주로 xargs를 사용하는 것이 더 효율적이라고 읽었기 때문입니다.
답변1
file
일치하는 파일 이름으로 대체된 후 실행되는 셸에서 와일드카드 확장을 수행해야 합니다. 따라서 에서 쉘을 시작해야 합니다 xargs
.
xargs
exec
을 사용하는 것보다 술어를 사용하는 것이 더 좋습니다 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_glob
zsh에서도 작동합니다. 그런 다음 사용할 수 있습니다
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")
}'