dos2unix 처리를 위해 *.c 파일을 반복적으로 검색합니다.

dos2unix 처리를 위해 *.c 파일을 반복적으로 검색합니다.

목표는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:~/csimdos2unix

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 *.cin은 디렉토리에 있는 모든 파일의 이름으로 대체됩니다(*.c는 옵션의 여러 인수로 확장됩니다). 그럴 것입니다. 여기서 find 성공 후 검색을 시작하면 하나의 매개변수만 허용되기 때문에 오류가 발생합니다. (파라미터가 1개만 있는 경우 결과에 기록되며 더 이상 하위 디렉터리에서 검색이 수행되지 않습니다.).c*.cfind.c-namefind . -name abc.c bcd.cbcd.cabc.c-name.c

.c그러나 디렉터리에 파일이 없으면 *in의 실제 의미는 *.c그대로 유지됩니다.

그래서 들어가서 모두 검색을 ~/csim/exercise사용하려고 하면 명령이 실행되는 디렉터리에 파일이 없는 find것 같습니다 . *.c이것이 바로 in의 와일드카드 의미가 유지되고 하위 디렉터리에서 검색이 성공하는 이유입니다. 그 이후에는 파일이 2개 이상인 것으로 의심되어 검색에 실패했습니다.*.cfind**.ccd ..~/csim/*.c

해결 방법은 더 간단합니다. 와일드카드를 이스케이프 처리하면 충분합니다. 다음 중 하나를 사용하십시오.

find .  -name '*.c'
or
find .  -name \*.c
or
find .  -name "*.c"

관련 정보