이름이 대문자로 시작하는 모든 파일을 현재 디렉터리에서 u
아래의 디렉터리 로 이동하려고 합니다 ~/tmp
.
이 명령을 시도했지만 find . -type f -name "*[[upper]]*" -exec mv -t ~/tmp/u
작동하지 않습니다.
답변1
당신은 매우 가깝습니다.
마크업에는 콜론을 사용해야 합니다
[[:upper:]]
."*[[:upper:]]*"
모든 이름을 찾을 것입니다포함하다대문자. 이름이 있는 파일만 가져오기시작대문자의 경우"[[:upper:]]*"
(첫 번째 문자 생략*
)을 사용합니다.그냥 말하면
find . -name '[[:upper:]]*'
그럴 것이다목록이름이 대문자로 시작하는 모든 파일. 그러나 를 사용할 때는 명령에 파일 이름을 포함하도록
-exec
지시해야 합니다 .find
{}
(그리고 당신은해야언제나
find
명령을 실행하라고 지시하기 전에 인쇄 전용 모드에서 명령, 특히 파일 시스템을 수정하는 명령을 디버그하십시오. 사용은 일반적인 디버깅 기술입니다. )-exec echo mv …
그러나 를 사용할 때는 명령을 (또는 이에 상응하는 ) 또는 로 종료
-exec
해야 합니다 . (보다';'
\;
+
매뉴얼 페이지, 또는이 질문에 대한 Stéphane Chazelas의 답변, 구별을 위해. ) 사용하고 계시기 때문에mv -t
사용하시면 됩니다+
.
그래서 마지막 명령은
find . -name '[[:upper:]]*' -exec mv -t ~/tmp/u {} +
답변2
GNU 구현 구문은 다음 mv
과 같습니다.
find . -type f -name '[[:upper:]]*' -exec mv -t ~/tmp/u {} +
또는 표준적으로:
find . -type f -name '[[:upper:]]*' -exec sh -c '
exec mv "$@" ~/tmp/u/' sh {} +
이는 파일 이름의 패턴과 일치하기 위한 것입니다.시작대문자의 경우 대문자( 대괄호 표현식 [:upper:]
내부의 POSIX 문자 클래스 [...]
)와 그 뒤에 원하는 수의 문자( *
)가 일치하도록 하려고 합니다.
find
끝점이 어디인지 알려주어야 합니다 -exec some command with its args
. 그건:
- 명령이 파일당 한 번씩 실행되도록 지시하는 인수
;
(셸 명령줄에서는 따옴표로 묶어야 합니다. 예를 들어';'
,\;
,";"
...는;
모든 셸에서 특수 문자이기도 함) (이 경우 에는 명령줄 매개변수는 파일 경로로 대체됩니다.find
{}
- 또는 매개변수의 순서입니다
{}
+
. 하나만 있을 수 있으며{}
그 전에 와야 합니다+
. 이 경우 명령은 여러 파일에 대해 동시에 호출되고{}
파일 목록으로 대체됩니다.
마지막 으로 find
다음을 실행하십시오.
mv -t /home/you/tmp/u ./File1 ./File2 ./dir/File3...
첫 번째 경우,-t
모든 소스 파일이 끝에 위치하도록 허용합니다.sh -c 'mv "$@" ~/tmp/u/' sh ./File1 ./File2 ./dir/File3...
POSIXly. 그렇지 않은 경우 매개변수를 마지막에 배치할 수 있도록-t
호출하여 매개변수 순서를 변경해야 합니다 . 여기서 최종 실행은 다음과 같습니다. ( 동일한 프로세스에서 일부 구현은 이미 명시적일 필요가 없는 최적화를 수행하고 있기 때문입니다 .)sh
~/tmp/u/
sh
mv ./File1 ./File2 ./dir/File3... /home/you/tmp/u/
exec
sh
exec
후행은 입력을 보장하는 것 /
입니다 .mv ... ~/tmp/u/
mv
이사 오다모델. mv a b
또는 이름 a
을 b
(이동하다) 또는 b/a
(이사 오다) b
디렉토리인지 여부에 따라 다릅니다. 후행을 추가함으로써 /
우리는 그것이 후자인지 확인합니다. 또는 적어도 b
디렉터리가 아닌 경우 이름이 다음 a
으로 바뀌는 대신 오류가 보고됩니다 b
(do이동하다). 위 코드에서는 find
파일이 하나만 발견된 경우에 대한 것입니다. (여러 파일 이동)은 항상find
mv a b c
이사 오다다음과 같은 작업( c
디렉토리여야 함)이동하다이 경우에는 의미가 없습니다.
답변3
find . -type f -name "[A-Z]*" -exec mv {} <destination directory> \;