![ls는 디렉토리에서 특정 이름을 가진 파일을 찾지만 find는 그렇지 않습니다.](https://linux55.com/image/200996/ls%EB%8A%94%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90%EC%84%9C%20%ED%8A%B9%EC%A0%95%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EA%B0%80%EC%A7%84%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%B0%BE%EC%A7%80%EB%A7%8C%20find%EB%8A%94%20%EA%B7%B8%EB%A0%87%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
로 시작하는 이름을 찾으려고 합니다 80s
.
ls 80s*/*
올바른 파일을 찾았지만 find . -ipath '80s*/*'
아무것도 반환되지 않습니다. find
이 작업에 대한 올바른 명령은 무엇입니까?
find
이러한 파일을 모두 다른 폴더로 이동하고 구문 분석하고 싶지 않기 때문에 사용해야 합니다 ls
.
답변1
-ipath
현재 path 를 포함하여 전체 경로 이름과 일치합니다 .
. 따라서 패턴에 다음을 포함해야 합니다.
find . -ipath './80s*/*'
위의 내용도 디렉토리를 출력합니다. 일반 파일만 나열하려면 다음을 사용하십시오.
find . -ipath './80s*' -type f
(또는 ! -type d
디렉토리를 제외한 모든 유형의 파일에 대해)
답변2
말씀하신 대로 80s*/*
올바른 파일이 일치하면 해당 파일을 사용할 이유가 전혀 없습니다 find
.
80s*/*
일치하는 모든 이름을 일부 대상 디렉토리로 이동하려면 destdir
다음을 사용할 수 있습니다.
mv -n 80s*/* destdir/
이렇게 하면 일치하는 디렉터리의 숨겨지지 않은 모든 이름이 80s*
단일 디렉터리로 이동됩니다 destdir
. 비표준 -n
옵션은 일반적으로 "파괴 없음"을 의미합니다. 즉, 이름 충돌이 있어도 파일을 덮어쓰지 않습니다.
mv
GNU를 사용하는 경우 위에서 설명한 대로 옵션(예: ) 또는 ()을 사용하여 다른 파일과 동일한 이름의 파일을 덮어쓰는 것을 방지 할 수도 있습니다 .--backup
--backup=numbered
-n
--no-clobber
꼭 골라야 한다면정기적인파일을 삭제하거나 80s*/*
너무 긴 이름 목록으로 확장하는 경우 루프를 사용하세요.
for name in 80s*/*; do
[ ! -f "$name" ] && continue
mv -n "$name" destdir/
done
(이렇게 하면 심볼릭 링크도 일반 파일로 이동됩니다. 이러한 상황을 방지하려면 심볼릭 링크인 경우 -h
/test를 추가로 사용하세요.)-L
"$name"
zsh
셸 에서는 다음을 사용하여 패턴과 일치하는 모든 일반 파일을 이동할 수 있습니다.
mv -n 80s*/*(.) destdir/
...여기서 glob 한정자는 (.)
일반 파일만 포함하도록 이전 패턴의 결과를 필터링합니다( (-.)
일반 파일에 대한 심볼릭 링크도 포함).
꼭 사용해야 한다면 find
다시 생각해보세요
find ./80s*/ -path './80s*/*' -prune ! -name '.*' -type f \
-exec mv -n {} destdir/ \;
이는 관심 있는 이름과 일치하며 이름을 숨기는 것을 방지합니다( 80s*/*
일치가 정확하다고 말하면 이름을 숨길 필요가 없다는 의미라고 가정합니다). 그것자두일치하는 모든 이름, 즉 패턴과 일치하는 하위 디렉터리를 입력하지 않고 이름이 일반 파일에 해당하는 경우 destdir
이전과 같이 사용할 파일을 이동합니다.mv -n
mv
GNU를 사용 하면 원본 . 이렇게 하면 각 이름에 대해 한 번 호출하는 대신 발견된 파일 이름을 일괄적으로 실행합니다.-exec mv -n -t destdir/ {} +
-exec
mv
mv