
그래서 다양한 디렉터리에서 제거해야 하는 수백 개의 파일 목록이 포함된 파일이 있습니다. 가장 쉬운 방법은 배치 파일을 만드는 것이라고 생각했지만 많은 성공을 거두지 못했습니다.
#/bin/bash
rm "/home/e-smith/files/users/bill/Maildir/cur/1392373930.28512.comp01:2,S"
rm "/home/e-smith/files/users/ted/Maildir/cur/1420726198.17690.comp01:2,S"
하지만 스크립트를 실행하면
./myfile.txt
알겠어요
rm: cannot remove '/home/e-smith/files/users/bill/Maildir/cur/1392373930.28512.comp01:2,S\r': no such file or directory
rm: cannot remove '/home/e-smith/files/users/ted/Maildir/cur/1420726198.17690.comp01:2,S\r': no such file or directory
나는 그것이 어디서 왔는지 이해하지 못합니다 \r
. 캐리지 리턴인 것 같지만 명령에 추가됩니다.
이와 같은 연습에 대한 올바른 접근 방식/구문은 무엇입니까?
답변1
이는 Windows에서 사용하는 줄 종결자( )로 인해 \r\n
발생합니다 .
다음 방법으로 삭제할 수 있습니다 vi
.
$ vi myfile.txt
<ESC>
:set fileformat=unix
:wq
답변2
rm
수백 개의 파일 이름 목록이 있고 이를 삭제하려는 경우 각 파일 이름에 대해 별도의 명령을 작성할 이유가 없습니다 . 파일 이름이 list.txt
한 줄에 하나씩 이름이 지정된 파일에 저장되어 있다고 가정합니다.개행 문자가 포함되어 있지 않습니다., 넌 할 수있어
while read -r file; do rm "$file"; done < list.txt
설명하다
- 이
while read variable; do something; done < file
구성은 파일의 각 행을 읽고 이를 다음과 같이 저장합니다variable
(위 예에서 변수 이름은 입니다file
). 파일 이름에 또는 같은 항목이-r
포함되도록 허용 해야 합니다 . 사용하면 문자 그대로 처리되고, 사용하지 않으면 각각 캐리지 리턴이나 탭으로 확장됩니다.\r
\t
-r
rm "$file"
: 읽으면 목록의 모든 파일이 제거됩니다.
mapfile
또는 파일 줄을 배열에 저장하는 bash의 내장 함수를 사용할 수 있습니다 .
mapfile -t filelist < list.txt && rm "${filelist[@]}"
답변3
답장을 보내주셔서 감사합니다. 기술적인 이유는 파일 인코딩 어딘가에 있을 수 있지만 문제를 해결하기 위해 방금 CentOS 시스템에서 파일을 만들었습니다.
$> touch myfile.txt
$> nano myfile.txt
내 bash 스크립트에 "!"를 추가했습니다(@jimmij에게 감사드립니다)
#!/bin/bash
저장 후 Windows에서 notepad++를 사용하여 초기 구문과 빙고를 기반으로 삭제하고 싶은 파일을 추가했습니다.
제안해주신 @Marko Frelih, @jimmij에게 감사드립니다.
답변4
xargs는 "뭔가"를 수행하고 무언가의 목록을 만듭니다...
cat file_containing_list_of_files_to_delete.txt | xargs rm
파일을 만들어
touch file1
foo라는 파일을 봅니다.
cat foo
file1
file2
file3
foo 파일에 언급된 파일을 삭제합니다.
cat foo | xargs rm
rm: cannot remove `file2': No such file or directory
rm: cannot remove `file3': No such file or directory
file1은 이제 사라졌습니다.
ls file1
ls: cannot access file1: No such file or directory