다음 형식의 일부 출력이 있습니다.
foo: /some/long/path_with_underscores-and-hyphens/andnumbers1.ext exists in filesystem
foo: /another/one.ext exists in filesystem
bar: /another/path/and/file.2 exists in filesystem
이 파일들을 삭제해야 해요. 각 경로를 추출하고 파일을 삭제하려면 어떻게 해야 합니까? awk
항상 행의 두 번째 요소이기 때문에 경로를 캡처하는 것이 가능하다는 것을 알고 있지만 캡처를 시작하고 rm
.
답변1
단순한awk
+xargs
방법:
awk '{ print $2 }' file | xargs -n1 rm
답변2
다른 답변 외에도:
파일 경로에 공백이 포함되어 있습니까? 그렇다면 제대로 처리해야 합니다. GNU sed를 통해 올바른 파일 경로를 얻으려면 다음 명령을 사용해 보십시오.
sed -r 's/^.*: (.*)/\1/;s/^(.*) exists in filesystem$/\1/' file
또는 POSIX:
sed -e 's/^.*: \(.*\)/\1/' -e 's/^\(.*\) exists in filesystem$/\1/' file
다음과 같은 파일이 있는 경우:
foo: /some/long/path_with_underscores-and-hyphens/andnumbers1.ext exists in filesystem
foo: /another/one.ext exists in filesystem
bar: /another/path/and/file.2 exists in filesystem
123 ret: /another/path/and/file 2 exists in filesystem
123 ret: /another/space path/and/file 2 exists in filesystem
결과는 다음과 같습니다:
/some/long/path_with_underscores-and-hyphens/andnumbers1.ext
/another/one.ext
/another/path/and/file.2
/another/path/and/file 2
/another/space path/and/file 2
파일을 삭제하려면 xargs
위와 같이 사용하되 다음 -d
옵션을 사용하세요.
sed pattern | xargs -n1 -d '\n' rm
답변3
awk
그 기능이 있습니다 system()
.
awk '{ system("echo rm "$2) }' list
파일 이름에 공백이 없을 때 아래 방법을 시도하면 위의 내용이 맞습니다.
awk '{gsub(/^.*: | exists in filesystem$/,""); system("echo rm \"" $0"\"")}' list
위의 방법 중 어느 것도 파일 이름(있는 경우)에서 개행 문자를 감지할 수 없습니다.
시험 실행을 위해 제거되었습니다 echo
.