파일 이름 패턴을 기반으로 현재 디렉터리의 모든 파일을 chown

파일 이름 패턴을 기반으로 현재 디렉터리의 모든 파일을 chown

모든 파일 이름을 로 변경하려고 합니다 ChownFileNames. 이 명령을 사용했지만 작동하지 않는 것 같습니다.

find . -maxdepth 1 |grep 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;

내가 뭘 잘못했나요?

답변1

chown hadoop:hadoop ChownFileNames*

답변2

이는 귀하의 요구 사항에 적합해야 합니다.

find . -maxdepth 1 -iname 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;

답변3

("파이프") 표기법은 |왼쪽 명령의 출력을 오른쪽 명령으로 전달하는 것을 의미합니다. 이 명령은 find . -maxdepth 1현재 디렉터리(및 .자체)의 파일을 나열합니다. 명령이 grep 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;의미가 없습니다. 명령 findgrep옵션을 전달하고 있습니다.

find파일명 자체를 일치시키는 방법이 있는데, 이것이 -name술어이다. 인수로 쉘 와일드카드 패턴을 사용합니다.

grep필터링된 목록을 사용할 수 있지만 유효한 명령줄을 제공해야 합니다 grep. 쉘 패턴과 일치하는 파일 이름만 유지하려면 ChownFileNames*정규식을 사용해야 합니다 /ChownFileNames[^/]$. 그런 다음 출력을 구문 분석 grep하여 일치하는 이름 목록을 명령줄 인수로 변환해야 합니다. Linux를 실행 중이고 파일 이름에 개행 문자가 포함되어 있지 않다고 가정하면 다음을 사용할 수 있습니다 xargs.

find . -maxdepth 1 |
grep '/ChownFileNames[^/]*$' |
xargs -d '\n' chown hadoop:hadoop

find사용된 무브먼트는 훨씬 더 간단하고 견고합니다 -exec. -exec … {} +파일당 한 번이 아니라 한 번에 파일 배치에 대해 이 명령을 실행할 수 있습니다 . find현재 디렉터리를 나열 할 수도 있습니다 .

find . maxdepth 1 \( -name . -o -name 'ChownFileNames*' \) -exec chown hadoop:hadoop {} +

find일반적으로 하위 디렉터리를 탐색하지 않고 현재 디렉터리의 이름(예: 날짜가 아닌)으로 파일을 일치시킬 때 실행하는 것은 의미가 없습니다. 현재 디렉토리에 파일이 너무 많아 명령줄이 너무 길어지지 않는 한 다음을 사용하세요.

chown hadoop:hadoop . ChownFileNames*

답변4

-name또는 -iname에서 옵션을 확인하세요 .find(1)

관련 정보