모든 파일 이름을 로 변경하려고 합니다 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 -- {} . \;
의미가 없습니다. 명령 find
에 grep
옵션을 전달하고 있습니다.
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)