특정 파일이 고유한 경우 디렉터리에서 해당 파일을 삭제합니다.

특정 파일이 고유한 경우 디렉터리에서 해당 파일을 삭제합니다.

나는 많은 디렉토리와 하위 디렉토리를 가지고 있습니다. 디렉토리에서 특정 파일을 재귀적으로 삭제하고 싶습니다(해당 파일이 디렉토리에 있는 유일한 파일인 경우). 또한 이 디렉터리에는 하위 디렉터리가 없다고 가정합니다. 따라서 요약하면 가설은 다음과 같습니다.

  • 파일 이름은 README.TXT입니다(대소문자 구분 안 함).
  • 파일이 발견된 디렉터리에 다른 파일이나 디렉터리가 없습니다.

구조:

 mkdir usecase
 cd usecase
 mkdir destroy_this
 touch destroy_this/readme.txt
 mkdir do_not_destroy_this
 touch do_not_destroy_this/readme.txt
 touch do_not_destroy_this/something-else.txt
 mkdir do_nothing
 cd do_nothing
 mkdir rm_this
 touch rm_this/README.TXT
 cd ..
 mkdir do_nothing_here
 cd do_nothing_here
 mkdir has_sub_dir
 touch README.TXT
 cd ..

위의 코드를 실행하면 다음과 같은 트리 구조가 생성됩니다.

$ tree .
.
`-- usecase
    |-- destroy_this
    |   `-- readme.txt
    |-- do_not_destroy_this
    |   |-- readme.txt
    |   `-- something-else.txt
    |-- do_nothing
    |   `-- rm_this
    |       `-- README.TXT
    `-- do_nothing_here
        |-- has_sub_dir
        `-- README.TXT

이것이 내가 지금까지 얻은 것입니다:

find . -type f -iname "readme.txt" -exec sh -c 'ls $(dirname "{}") | wc -l' \;

아이디어는 파일과 디렉토리의 수를 세고, 하나라면 파일을 삭제한다는 것입니다.

답변1

당신이 가지고 있는 것이 좋은 출발점이 됩니다. 콘텐츠를 수정하는 경우 카운트 상태가 1인지 여부에 따라 작동할 수 있는 구성을 -exec도입할 수 있습니다 .if/then

$ find . -type f -iname "readme.txt" -exec \
    sh -c 'if [ "$(ls $(dirname "{}") | wc -l)" -eq "1" ]; \
        then echo "yes"; \
        else echo "no"; \
    fi' \;
no
yes
yes
no

이 방법으로 echo "yes"명령을 확장하여 실제 파일 삭제를 수행할 수 있습니다. 이와 같은 것이 rm "{}"트릭을 수행해야합니다.

$ find . -type f -iname "readme.txt" -exec \
    sh -c 'if [ "$(ls $(dirname "{}") | wc -l)" -eq "1" ]; \
        then echo "removing {}.."; rm "{}"; \
        else echo "no"; \
    fi' \;
no
removing ./usecase/destroy_this/readme.txt..
removing ./usecase/do_nothing/rm_this/README.TXT..
no

위 명령을 두 번째로 실행하면 파일이 더 이상 존재하지 않는 것으로 확인됩니다.

$ find . -type f -iname "readme.txt" -exec \
    sh -c 'if [ "$(ls $(dirname "{}") | wc -l)" -eq "1" ]; \
        then echo "removing {}.."; rm "{}"; \
        else echo "no"; \
    fi' \;
no
no

답변2

find . -type f -iname "readme.txt" -exec sh -c '
    for f do ls -1qap ${f%/*} | 
        grep -v "\(readme.txt\$\|/\$\|.\{1,2\}\$\)" &&
    echo rm "$f" ; done' \{\} +

관련 정보