다음과 같이 AIX의 마지막 5개 복사본을 유지하는 bash 스크립트가 있습니다.
rm `ls -lt /path/the_file_* | tail -n +6`
하지만 다음 오류가 발생합니다.
rm: Not a recognized flag: w
고쳐 쓰다
이 ls
명령은 다음을 반환합니다.
-rw-r--r-- 1 user group1 14 Mar 11 09:54 the_file_20130311.bz2
이에 대한 단서가 있나요?
답변1
당신이 말하는 것은 본질적으로
rm -rw-r--r-- 1 user group1 14 Mar 11 09:54 the_file_20130311.bz2
다시 말해서. 재귀 삭제의 이름은 다음과 같습니다.
1
user
group1
14
Mar
...
-w
rm 플래그와 기타 이상한 것들이 있는 경우-rw-r--r--
더 나은 옵션은 를 사용하는 것입니다 . 출력이 tty로 가는지 감지 ls -t
할 수 있으므로 별도의 줄에 있지 않아도 걱정하지 마십시오 .ls
예를 들면 다음과 같습니다.
ls -t | cat
그러나 또 다른 문제가 발생합니다. 즉, 올바른 디렉토리에 있지 않다는 것입니다. 그래서 당신이 말하는 것은 실제로 현재 디렉토리에서 /path/
.
따라서 먼저 올바른 경로에 있는지 확인하거나 find
시스템에 GNU를 설치할 수 있는 경우 다른 옵션은 다음 방향이 될 것입니다.
find /path/to/files -maxdepth 1 -type f -name 'the_file_*' -printf '%T@ %p\n' |
sort -nr | head -n6 | cut -f2- -d" "
올바른 목록을 얻으려면 전체 경로가 필요합니다.
그런 다음 좋아 보이면 rm
루틴에 추가하세요.
답변2
명령은 무엇을 반환합니까 ls ...
? 명령이 실행되고 출력이 인수로 제공된다는 점을 기억하십시오 rm
. 출력을 "파일 이름"으로 만드는 것은 없습니다. -w
실제로 거기에 파일이 있어야 한다면(아마도 AIX --
에 닫는 플래그가 있을 수 있음), 있어야 합니다.rm -- ...
고쳐 쓰다:
아, 뇌가 물에 잠겼어요. 파일 이름 뿐만 아니라 , 및 (위에서 언급한 대로) ls -l
권한도 플래그로 사용됩니다. 당신이 해야 할 일:-rw...
rm
rm `ls -t /path/the_file_* | tail -n +6`
일부 명령(이것은 다른 많은 명령이 채택한 GNU 규칙임)은 --
"플래그가 여기서 끝납니다"를 의미합니다. 따라서 이름이 -rf
지정된 파일을 삭제하려면 rm -- -rf
이렇게 하면 일반적으로 don't pick up false flags 라고 말할 수 있습니다 cmd -flags -x -y -- anything goes here
.