확장자가 없는 파일에 와일드카드를 사용하는 방법

확장자가 없는 파일에 와일드카드를 사용하는 방법

나는 이것에 완전히 놀랐다. 로그 파일을 디렉터리로 이동하는 주간 스크립트를 실행하고 있습니다.

mkdir 2022-04-30
mv *.* 2022-04-30/ 

이렇게 하면 확장자가 있는 파일만 이동되고 확장자가 없는 파일은 이동되지 않습니다.

시도하면 *.파일을 찾을 수 없다고 뜹니다

시도하면 *원하는 대로 작동하지만 디렉토리를 2022-04-30자체로 이동하려고 시도하고 오류를 인쇄합니다. 스크립트에는 영향을 미치지 않지만 무슨 일이 일어나고 있는지 이해하고 싶습니다.

나는 *0개 이상의 문자를 의미한다고 확신합니다. 따라서 *.*모든 파일을 이동해야 하지만 디렉터리는 이동하지 않아야 합니다.

무슨 일이 일어나고 있으며 디렉토리를 이동하지 않고 필요한 작업을 수행하는 스크립트를 어떻게 만들 수 있습니까?

CentOS 9/배시

편집하다:

파일 이름 예시

2022-04-29abc.cde
2022-04-29 App

답변1

*0개 이상의 문자를 나타냅니다.

따라서 일부 문자 뒤에 점이 있고 그 뒤에 더 많은 문자가 있음을 의미하므로 , *.*와 일치 하지만 중간에 있는 점이 아무 것과도 일치하지 않기 때문에 확장자가 없는 파일은 이동하지 않습니다.foo.barfoo. .barfoo.bar.bazfoobarfoobar

*.foo.그러면 대신 에만 일치합니다 foo.bar. 왜냐하면 a로 끝나는 항목만 찾기 때문입니다..

디렉터리가 아닌 파일만 이동하려면 다음과 같은 것을 사용하는 것이 좋습니다. 이렇게 하면 하위 디렉터리의 파일이 아닌 현재 디렉터리( )의 find . -maxdepth 1 -type f모든 파일을 찾습니다 ( 제한하면 지정된 폴더에만 모든 콘텐츠가 포함됩니다). 단일 레이어 하위 폴더 등), 일반 파일만 필터링.maxdepthmaxdepth 1maxdepth 2-type f

find . -maxdepth 1 -type f -exec mv {} 2022-04-30/ \;작동해야 하지만 순수한 bash는 아니므로 모든 시스템에 이식할 수는 없습니다.

-execfind가 그 이후의 콘텐츠를 실행하는 경우, {}는 차례로 명령의 각 find결과 입니다.

(공백과 개행 문자가 포함된 파일 이름을 사용하여 간략하게 테스트했습니다.)

(댓글에서 잘못된 파일 이름을 사용하도록 편집됨)

답변2

*.단일 문자 포인트를 나타내는 0개 이상의 임의 문자를 나타냅니다 . 따라서 *.*(적어도 하나의) 점 이름이 있는 모든 장소를 의미합니다. Unix 계열 시스템에서 점은 파일 이름의 일반 문자일 뿐이며 일반 글로브의 파일과 디렉터리 간에 차이가 없습니다. (디렉터리만 일치시키려는 경우에 사용할 수 있습니다 */.)

*[[:alpha:]]*여기서는 파일 이름에 문자가 포함되어 있지만 디렉터리에는 포함되지 않은 것처럼 보이므로 적어도 하나의 문자가 포함된 이름을 일치시키는 데 사용할 수 있는 대상을 지정합니다 . 이는 여전히 디렉토리와 일치하지만 2022-04-30.

또는 비슷한 작업을 수행하는 경우 mv 2022-04-29* 2022-04-29(예: 날짜로 시작하는 파일을 일치하는 디렉터리로 이동) 다음을 사용할 수 있습니다.

mv 2022-04-29?* 2022-04-29

정확히 ?한 문자 와 일치하므로 ?*날짜 뒤에 최소한 한 문자가 필요합니다.

zsh에서는(Bash에서는 제외) 을 사용하여 *(.)일반 파일(및 유사하게 *(/)디렉터리만)만 일치시킬 수 있습니다. 모든 셸에서는 */디렉터리만 일치하지만 일반 파일에만 해당하는 것은 없습니다. (약간의 차이점은 */이름이 슬래시와 함께 생성된다는 것입니다.)

관련 정보