디렉토리에 다음 파일이 있습니다.
-rw-r--r-- 1 smsc sys 46 Apr 22 12:09 bills.50.1.3G.MO.X.20120422120453.Z
-rw-r--r-- 1 smsc sys 28 Apr 22 12:15 bills.50.1.3G.MO.X.20120422120953.Z
-rw-r--r-- 1 smsc sys 46 Apr 22 12:20 bills.50.1.3G.MO.X.20120422121453.Z
-rw-r--r-- 1 smsc sys 46 Apr 22 12:25 bills.50.1.3G.MO.X.20120422121953.Z
다섯 번째 열은 파일 크기입니다. 크기가 46인 파일을 모두 삭제하고 싶습니다. 이러한 파일을 필터링하기 위해 다음 명령을 사용했습니다.
ls -ltr | awk '$5 ~ /46/ {print $0}'
좋은 결과. 하지만 이제 필터링된 모든 파일을 삭제하고 싶으므로 위 명령에 다음을 추가합니다.
ls -ltr | awk '$5 ~ /46/ {print $0}' | xargs rm
하지만 다음과 같은 오류가 발생합니다.
rm: invalid option -- w
find
over를 사용해야 ls
다음 형식으로 출력되는 것 같습니다.
./bills.50.1.3G.MO.X.20120421050453.Z
./bills.50.1.3G.MO.X.20120421154953.Z
./bills.50.1.3G.MO.X.20120419133452.Z
하지만 해당 매개변수로 파일을 필터링할 수는 없습니다. 이 작업을 어떻게 수행할 수 있습니까?
답변1
두 가지 오류가 있습니다.
비교하고 있는 치수는포함하다
46
;너는 그러길 원해동일한46.파일 이름만 원할 때 전체 줄을 인쇄하는 것입니다.
그리고 보너스 질문: 정렬 순서를 사용하지 않을 때 출력을 -ltr
정렬하는 요점은 무엇입니까 ?ls
당신은 다음과 같은 일을하고 싶어
ls -l | awk '$5 == "46" {print $9}' | xargs rm
너 빼고아니요지금은 안전할 수 있지만 ls
출력 구문 분석은 신뢰할 수 없기 때문에 이 작업을 수행하고 싶습니다. 적절한 도구를 사용하십시오.
find . -maxdepth 1 -size 46c -delete # requires GNU find
(이렇게 하면 POSIX는 블록이 아닌 단위로 동작 하지 find
않기 때문에 더 귀찮습니다 . 파일을 가져오지 않고도 적절한 디렉토리 스캔을 사용할 수 있는 Perl/Python/Ruby/등등의 스크립트를 작성하는 것이 더 좋습니다. 문제가 있습니다. 이름에 특수문자 포함)-maxdepth
-size
답변2
zsh에서 현재 디렉터리(첫 번째 줄) 또는 현재 디렉터리와 해당 하위 디렉터리(두 번째 줄)에서 크기가 26인 모든 파일을 삭제하려면 다음을 사용하세요.L
글로벌 예선:
rm *(L26)
rm **/*(L26)
GNU 또는 FreeBSD/NetBSD/OSX를 사용하여 다음을 찾으세요.
find . -name . -o -type d -prune -o -type f -size 26c -exec rm {} +
find . -type f -size 26c -exec rm {} +
가지고 다닐 수 있는:
find . -name . -o -type d -prune -o -type f -exec sh -c '[ $(wc -c <"$0") -eq 26 ] && rm -- "$0"' {} \;
find . -type f -exec sh -c '[ $(wc -c <"$0") -eq 26 ] && rm -- "$0"' {} \;
답변3
find
여기가 최선의 선택입니다. 당신은 그것을 사용할 수 있습니다stat
사용하지 않고 파일 크기 찾기ls
for file in *; do
(( $(stat -c %s "$file") == 46 )) && rm "$file"
done