이 디렉토리에는 다양한 확장자를 가진 파일이 포함되어 있습니다. 마지막 5개 파일을 제외하고 확장자가 .gz, zx, ext4인 모든 파일을 삭제하고 싶습니다. 이 모든 파일을 나열할 수 있습니다.
ls -l | grep '\.gz\|xz\|ext4$'
그 중 가장 오래된 5개만 보여 드리겠습니다.
ls -l | grep '\.gz\|xz\|ext4$' | head -5
또는 마지막 5개 파일을 나열하십시오.
ls -l | grep '\.gz\|xz\|ext4$' | tail -5
그런데 위 명령에 나열된 5개 파일을 제외한 모든 파일을 삭제하는 방법을 모르겠습니다.
답변1
일반적인 정렬 순서가 적절하고(즉, 파일 이름이 날짜별로 지정됨) 쉘이 배열을 지원하는 경우 배열을 사용하여 다음을 피할 수 있습니다.사용시 일반적인 주의사항ls
:
F=(./*.{gz,xz,ext4}) # list files
G=("${F[@]:5}") # pick all but the first five to another array
G=("${F[@]:0:${#F[@]}-5}") # or pick all but the last five
rm -- "${G[@]}" # remove them
zsh
자체적으로 날짜별로 정렬할 수 있으므로 일치하는 파일을 배열로 가져와 수정 시간별로 정렬합니다.
F=(./*.(gz|xz|ext4)(Om))
( (Om)
최신순, (om)
최신순) 위와 같이 배열을 처리합니다.
물론, 수정된 날짜별로 정렬해야 하는 경우에는 다음을 사용할 수 없습니다 zsh
.파일 이름을 아는 것이 좋습니다, 간단한 것이 ls -t | tail -n +6
좋습니다.
( tail -n +6
인쇄는 6행에서 시작됩니다. 즉, 처음 5행을 건너뜁니다. 처음에는 이에 대한 편견이 있었습니다.)
GNU ls를 사용하면 쉘에 적합한 입력을 생성하기 위해 파일 이름을 인용하도록 요청한 다음 출력으로 배열을 채울 수 있다고 생각합니다.
eval "F=($(ls -t --quoting-style=shell-always ./*.{xz,gz}))"
그러나 이를 위해서는 이를 믿고 ls
쉘이 인용문을 해석하는 방법에 동의해야 합니다.
답변2
ls -1 | grep '\.gz$\|xz$\|ext4$' | tail -n +6 | xargs rm
참고: 파일에는 공백/따옴표가 포함되어서는 안 됩니다.
set -f; set ./*.[gx]z ./*.ext4; [ "$#" -gt 5] && shift 5; rm -f "$@"
다음은 모든 유형의 파일 이름에 적용됩니다.
td="`mktemp`" \
find . -maxdepth 1 -type f \( -name \*.[gx]z -o -name \*.ext4 \) -exec sh -c '
[ ! -s "$td" ] && [ "$#" -gt 5 ] && { shift 5; echo >> "$td"; }
rm -f "$@"
' x {} +
rm "$td"
답변3
거의 다 왔습니다.
긴 옵션 형식을 사용하여 원하는 줄 수를 지정한 다음 이를 무효화합니다. (반대 논리를 와 함께 사용할 수 있습니다 tail
).
head --lines=3
헤더에서 세 줄을 인쇄합니다.
head --lines=-3
마지막 3개를 제외하고 머리부터 모든 것을 인쇄합니다.
head
다음은 a와 8줄 파일을 사용하는 예입니다.f
$ cat f
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
$ head -3 f
line 1
line 2
line 3
$ head --lines=3 f
line 1
line 2
line 3
$ head --lines=-3 f
line 1
line 2
line 3
line 4
line 5
파일 삭제를 시작하기 전에 이 섹션에서 원하는 결과가 나오는지 확인하세요.
긴 옵션이 꼭 필요한 것은 아니지만 tail 및 head 명령의 진화와 이전 버전과 호환되어야 하는 유산이 없으며 기억하기가 더 쉽습니다.
head -n-3
매수 옵션과 동일head --lines=-3 f
아래를 참조하세요
$ head -3 f #originally
line 1
line 2
line 3
$ head -n3 f #
line 1
line 2
line 3
$ head -n+3 f
line 1
line 2
line 3
$ head -n-3 f
line 1
line 2
line 3
line 4
line 5
$
답변4
다음 명령은 마지막 5개 파일을 제외한 모든 파일을 나열합니다.
ls -l | grep '\.gz\|xz\|ext4$' | head -n `expr \`ls | grep '\.gz\|xz\|ext4$' | wc -l\` - 4`
파일을 쉽게 삭제하려면 이를 명령으로 변환할 수 있어야 합니다.