여러 개의 하위 디렉터리가 있고 /home/usr/ProjZ/programs/
각 디렉터리에는 여러 개(또는 하나) .js
의 파일이 포함되어 있습니다.
내가 해야 할 일은 .js
하위 디렉터리에 여러 파일이 포함된 경우 가장 큰 파일을 제외한 모든 파일을 삭제하고 .js
하위 디렉터리에 파일이 하나만 포함된 경우 아무 작업도 수행하지 않는 것입니다.
어떻게 해야 하나요?
답변1
그리고 zsh
:
for dir (/home/usr/ProjZ/programs/*(/)) rm -f $dir/*.js(.NOL[2,-1])
가장 큰 파일이 여러 개 있는 경우 하나만 보관됩니다. 어느 것이 현재 디렉터리에 나타나는 순서에 따라 달라집니다(보통 다소 무작위임).
GNUly(최근 GNU sed
for -z
)에 해당하는 내용은 다음과 같습니다.
for dir in /home/usr/ProjZ/programs/*; do
[ -d "$dir" && ! -L "$dir" ] || continue
find "$dir" -type f -printf '%s:%p\0' | sort -rzn |
sed -z '1d;s/[^:]*://' | xargs -r0 rm -f
done
답변2
.js 파일이 모두 하나의 디렉토리에 있는지 아니면 해당 지점 아래에 존재하는지 확실하지 않습니다.
단일 디렉터리에서 가장 큰 .js 파일을 제외한 모든 파일을 삭제하려면 다음을 수행할 수 있습니다.
$ ls -S *.js | tail --lines=+2 | xargs rm
파일에 공백과 같은 이상한 문자가 포함되어 있으면 안전하지 않습니다.
.js가 어떤 깊이로든 존재할 수 있다면 아마도 스크립트를 작성할 것입니다.
진주
use File::Find;
find(\&wanted, "/path/to/look/in");
my $biggest_file;
my $biggest_size = 0;
sub wanted {
if ($_ =~ /\.js$/) {
my ($size) = (stat $_)[7];
if ($size > $biggest_size) {
unlink $biggest_file if defined $biggest_file;
$biggest_size = $size;
$biggest_file = $File::Find::name;
}
}
}
답변3
이 작은 bash 스크립트는 .js 파일 이름에 공백이 포함될 수 있고 디렉터리에 .js 파일과 기타 확장자가 모두 포함될 수 있는 경우 올바르게 처리합니다.
#!/bin/bash "x"를 읽을 때 /home/usr/ProjZ/programs/* -type d | NUMFILES=`ls -1 "$x"/*.js |화장실-l` [[ $NUMFILES -gt 2 ]] && ls -1Sr "$x"/*.js 2>/dev/null |head-n $(($NUMFILES-2)) | xargs -I{} rm -f " {}" 완료 2>/dev/null
답변4
몇 가지 좋은 답변이 있지만, 특히 이 내용을 처음 접하는 경우에는 간단하게 설명하고 싶습니다 bash
.
다음은 여러분이 따라하는 데 도움이 되는 방법에 대한 몇 가지 의견입니다.
#!/bin/bash
# Loop through all subdirectories
for dir in $(find /home/usr/ProjZ/programs/ -type d)
do
# Get all .js files in this subdir
files=$(find $dir -maxdepth 1 -type f -name '*.js')
# If there's no files in here, just skip this subdir
if [ -z "$files" ]
then
continue
fi
# Get deletion candidates (sort by size, remove the biggest, get filenames)
rm_candidates=$(stat -c "%s %n" ${files} | sort -n | head -n -1 | cut -d" " -f2-)
# Finally, remove each file
for file in $rm_candidates
do
rm -f $file
done
done