목표는find
*.c 파일보류 중 dos2unix
:
find . -name *.c | xargs dos2unix -f
위 명령의 문제를 해결해 보세요.
user@host:~/csim/exercise$ find . -name *.c
./6-1/dinph_3p.c
./6-1/dinph_pi.c
./9-2/lift.c
./6-4/cmptr.c
./8-7/station.c
./7-4/hire.c
./5-2/ran_test.c
./8-4/cmptrm.c
./9-5/trunked.c
./8-5/computer.c
./9-3/aloha.c
./12-3/mcpu.c
./10-5/abp_pi.c
./6-2/dinph_3p.c
./6-2/dinph_pi.c
BASH가 디렉터리의 한 수준 위로 이동할 때 이런 일이 발생하는 이유는 무엇입니까?
$ cd ..
동일한 명령이 적어도 위에 나열된 .c 파일을 반환하지 않습니까?
user@host:~/csim$ find . -name *.c
find: paths must precede expression: random.c
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec|time] [path...] [expression]
답변1
와일드카드 문자(예: *.c
)를 검색할 때는 작은따옴표로 묶어야 합니다. 디렉토리를 위로 이동하면 입력한 디렉토리에 로 끝나는 파일이 두 개 이상 있을 것으로 예상됩니다 . .c
그 중 하나는 random.c
.*.c
디렉토리에 다음이 포함되어 있다고 가정 합니다 hi.c
.random.c
find . -name *.c
이 되다:
find . -name hi.c random.c
작은따옴표로 묶으면 *.c
쉘이 확장하지 않습니다.
아래의 각 파일을 찾아서 처리하려면 .c
:~/csim
dos2unix
find ~/csim -type f -name '*.c' | xargs dos2unix -f
답변2
@Andy의 내용에 더 많은 설명을 추가합니다.
기본적으로 find
명령에는 options 의 인수(자리 표시자)로 파일 이름이나 패턴이 필요합니다 -name
.
echo *.c
하나 이상의 파일이 포함된 디렉토리에서 실행 하려고 하면 .c
결과는 해당 파일의 공백으로 구분된 이름이 됩니다.
$echo *.c
abc.c bcd.c
.c
디렉토리에 파일이 없으면 결과는 다음과 같아야 합니다.
$echo *.c
*.c
마찬가지로, 2개 이상의 file 이 있는 디렉토리에서 find . -name *.c
in은 디렉토리에 있는 모든 파일의 이름으로 대체됩니다(*.c는 옵션의 여러 인수로 확장됩니다). 그럴 것입니다. 여기서 find 성공 후 검색을 시작하면 하나의 매개변수만 허용되기 때문에 오류가 발생합니다. (파라미터가 1개만 있는 경우 결과에 기록되며 더 이상 하위 디렉터리에서 검색이 수행되지 않습니다.).c
*.c
find
.c
-name
find . -name abc.c bcd.c
bcd.c
abc.c
-name
.c
.c
그러나 디렉터리에 파일이 없으면 *
in의 실제 의미는 *.c
그대로 유지됩니다.
그래서 들어가서 모두 검색을 ~/csim/exercise
사용하려고 하면 명령이 실행되는 디렉터리에 파일이 없는 find
것 같습니다 . *.c
이것이 바로 in의 와일드카드 의미가 유지되고 하위 디렉터리에서 검색이 성공하는 이유입니다. 그 이후에는 파일이 2개 이상인 것으로 의심되어 검색에 실패했습니다.*.c
find
*
*.c
cd ..
~/csim/
*.c
해결 방법은 더 간단합니다. 와일드카드를 이스케이프 처리하면 충분합니다. 다음 중 하나를 사용하십시오.
find . -name '*.c'
or
find . -name \*.c
or
find . -name "*.c"