파일을 만들어

파일을 만들어

그래서 다양한 디렉터리에서 제거해야 하는 수백 개의 파일 목록이 포함된 파일이 있습니다. 가장 쉬운 방법은 배치 파일을 만드는 것이라고 생각했지만 많은 성공을 거두지 못했습니다.

#/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

관련 정보