나는 이것에 완전히 놀랐다. 로그 파일을 디렉터리로 이동하는 주간 스크립트를 실행하고 있습니다.
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.bar
foo.
.bar
foo.bar.baz
foobar
foobar
*.
foo.
그러면 대신 에만 일치합니다 foo.bar
. 왜냐하면 a로 끝나는 항목만 찾기 때문입니다..
디렉터리가 아닌 파일만 이동하려면 다음과 같은 것을 사용하는 것이 좋습니다. 이렇게 하면 하위 디렉터리의 파일이 아닌 현재 디렉터리( )의 find . -maxdepth 1 -type f
모든 파일을 찾습니다 ( 제한하면 지정된 폴더에만 모든 콘텐츠가 포함됩니다). 단일 레이어 하위 폴더 등), 일반 파일만 필터링.
maxdepth
maxdepth 1
maxdepth 2
-type f
find . -maxdepth 1 -type f -exec mv {} 2022-04-30/ \;
작동해야 하지만 순수한 bash는 아니므로 모든 시스템에 이식할 수는 없습니다.
-exec
find가 그 이후의 콘텐츠를 실행하는 경우, {}는 차례로 명령의 각 find
결과 입니다.
(공백과 개행 문자가 포함된 파일 이름을 사용하여 간략하게 테스트했습니다.)
(댓글에서 잘못된 파일 이름을 사용하도록 편집됨)
답변2
*
.
단일 문자 포인트를 나타내는 0개 이상의 임의 문자를 나타냅니다 . 따라서 *.*
(적어도 하나의) 점 이름이 있는 모든 장소를 의미합니다. Unix 계열 시스템에서 점은 파일 이름의 일반 문자일 뿐이며 일반 글로브의 파일과 디렉터리 간에 차이가 없습니다. (디렉터리만 일치시키려는 경우에 사용할 수 있습니다 */
.)
*[[:alpha:]]*
여기서는 파일 이름에 문자가 포함되어 있지만 디렉터리에는 포함되지 않은 것처럼 보이므로 적어도 하나의 문자가 포함된 이름을 일치시키는 데 사용할 수 있는 대상을 지정합니다 . 이는 여전히 디렉토리와 일치하지만
2022-04-30
.
또는 비슷한 작업을 수행하는 경우 mv 2022-04-29* 2022-04-29
(예: 날짜로 시작하는 파일을 일치하는 디렉터리로 이동) 다음을 사용할 수 있습니다.
mv 2022-04-29?* 2022-04-29
정확히 ?
한 문자 와 일치하므로 ?*
날짜 뒤에 최소한 한 문자가 필요합니다.
zsh에서는(Bash에서는 제외) 을 사용하여 *(.)
일반 파일(및 유사하게 *(/)
디렉터리만)만 일치시킬 수 있습니다. 모든 셸에서는 */
디렉터리만 일치하지만 일반 파일에만 해당하는 것은 없습니다. (약간의 차이점은 */
이름이 슬래시와 함께 생성된다는 것입니다.)