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