~ (백업 파일)로 끝나는 파일은 피하십시오


20

내 요구 사항은 ~(백업 파일)로 끝나는 파일을 제외하고 디렉토리의 모든 파일을 나열하는 것 입니다.

명령을 사용하려고했습니다.

ls -l | grep -v ~    

나는이 출력을 얻는다 :

asdasad
asdasad~
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell1.sh~
testshell2.sh
testshell2.sh~
testtwo.txt
testtwo.txt~
test.txt
test.txt~

이 파일들만 가져오고 싶습니다 :

asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt

로 끝나는 파일을 나열하지 않으려는 것 같습니다 ~. 이 파일은 일부 텍스트 편집기에서 만든 백업 파일입니다.
ctrl-alt-delor

어떤 운영 체제를 사용하고 있습니까? Gnu / Linux입니까 (데비안, 우분투, Redhat, Centos, Fedora, Suse, 민트, 아치 등)?
ctrl-alt-delor

2
무시하려는 파일은 Emacs 백업 파일 인 것 같습니다. Emacs 동작을 변경하는 것이 다소 쉬워서 전체 디렉토리가 아닌 중앙 디렉토리에 백업을 저장합니다. 참조 emacs.stackexchange.com/questions/33/...
킬리안 Foth에게

미안하지만 미안하지만 당신을 믿지 않습니다. ls -l(글자)에는 나열된 각 파일의 권한, nlink, 소유자, 크기 및 modtime이 포함됩니다. 표시하는 출력은 ls -1(숫자 1)이며 많은 시스템 -1에서 터미널 에서 단일 열 출력을 생성하는 데 필요 하지만 ls파이프로 연결 grep되거나 (여기에서와 같이 ) 리디렉션 될 때 -1이미 단일 열입니다. .
dave_thompson_085

@ dave_thompson_085 나는 모든 텍스트와 파일 이름 만 잘라 버렸습니다. 나는 그것이 관련이 없다고 생각했기 때문에. 또한 이것은 내 시스템이 아닌 프로덕션 시스템입니다. 그래서 사용자 이름, 세부 정보를 나열하고 유출하고 싶지 않습니다.
curious_one

답변:


49
ls -l | grep -v ~

이것이 작동하지 않는 이유는 물결표가 홈 디렉토리로 확장되므로 grep문자 물결표를 보지 않기 때문입니다. (예 : Tilde Expansion에 대한 Bash 매뉴얼 참조 ) 확장 을 방지하려면 인용해야합니다.

ls -l | grep -v "~"

물론 이것은 파일 이름의 중간이나 ls출력의 다른 곳에서도 물결표가있는 출력 행을 여전히 제거합니다 (사용자 이름, 날짜 등에는 나타나지 않을 수도 있음). 물결표로 끝나는 파일 만 무시하려면

ls -l | grep -v "~$"

48

ls(대부분의 Linux 시스템에서 사용되는) GNU 구현 에는 다음과 같은 옵션이 -B있습니다. 백업 무시 :

ls --ignore-backups

24

bash를 사용하는 경우 extglob활성화되어 있는지 확인하십시오 .

shopt -s extglob

그런 다음 다음을 사용할 수 있습니다.

ls -d -- !(*~)
  • -d 디렉토리의 내용을 표시하지 않습니다
  • !(*~) 로 끝나는 파일을 제외한 모든 파일 ~

zsh에서는 kshglob옵션 또는 자체 확장 글로브를 사용하여 동일한 작업을 수행 할 수 있습니다 .

setopt extended_glob
ls -d -- ^*~

제외 할 접미어는 한 문자 길이이므로 마지막 문자가 물결표가 아닌 파일 이름을 일치시킬 수도 있습니다 (이 없이도 작동해야 함 extglob).

ls -d -- *[^~]

그러나 일반적인 아이디어는를 사용하는 것 ls --ignore-backups입니다.


12

이것은 도움이 될 것입니다 :

ls -l | grep -v '~'  

이유 : ~ char는 명령이 실행되기 전에 홈 디렉토리로 바뀝니다. 시험

echo ~

echo '~'

6

다른 답변에서 언급했듯이 문제가 발생했을 가능성이 큰 이유는 물결표를 인용하거나 피하지 않았기 때문입니다.

특정 유스 케이스의 경우 쉘 파일 이름 확장을 사용하여 비슷한 작업을 수행했습니다. 필자는 2003 년 이래로이를 사용해 왔으며, 이는 다양한 종류의 시스템에서 매우 다양한 셸 구현을 수행했음을 의미합니다. (여기서는 -C정렬 된 열에 멋진 표시를 원 하기 때문에 사용합니다 )

ls -C *[!~]

(셸 파일 이름 확장을 사용할 때의 제한 사항은 물론 (백업이 아닌) 파일이 매우 많은 디렉토리가 확장이 사용 가능한 인수 목록 크기를 초과하게한다는 것입니다. 대부분의 최신 시스템에서는이 제한이 상당히 높습니다 250KB 이상, 때로는 훨씬 더)


1

ls | grep -v '~$'빠른 해결책입니다. ls를 사용하여 (숨겨지지 않은) 모든 파일을 나열한 다음 grep을 사용하여 -v(반전 된 일치, 제외) ~끝에 물결표 ( )가있는 모든 행을 끝에서 제외합니다 ( $).

그럼에도 불구하고 something1, something2와 같은 이름의 파일이 있으면 워크 플로가 잘못되었다는 큰 냄새 나는 지표입니다. ls 작동 방식을 수정하는 것과 같은 이상한 해킹이 아닌 소스에서 수정해야합니다.

test1 및 test2 또는 testone 및 testtwo와 같은 버전 번호로 파일 이름을 지정하는 경우 실제로 원하는 것은 다음과 같은 버전 제어 시스템 git입니다.

여러 파일의 여러 버전이 있고 모든 파일간에 버전을 조정해야하는 경우에 특히 그렇습니다.

버전 관리 시스템을 사용하면 파일 시스템에 시간 창을 본질적으로 오버레이 할 수 있으므로 하나의 test파일 만 볼 수 있지만 버전 관리 프로그램을 통해 모든 버전을 검색, 검색, 되돌리기, 비교할 수 있습니다. .

이 설정을 한 후에는 그 이후로 수천 번 변경하더라도 버전 제어에 파일 사용 내역이 있기 때문에 버전 제어에 파일 히스토리가 있으므로 더 이상 편집기에서 백업 파일이 필요하지 않습니다. 필요에 따라 기록 타임 라인을 "분기"하여 새로운 아이디어를 시도한 다음 시간을 거슬러 올라가서 다른 아이디어를 시도 할 수도 있습니다.


1

많은 답변이 정확하지만 ( @Foon특히 하나를 좋아합니다 ) 이름 목록을 얻는 것은 ls -l여러 가지 이유로 약간 불충분합니다.

파일을 찾는 적절한 도구는 당연히 find입니다.

그 결과 중 하나는 예를 들어 "선택 로직"자체를 처리 할 수 ​​있다는 것입니다.

$ find . -maxdepth 1 \( -type f -a \! -name '*~' \) -print

말 그대로 find:

  1. 현재 디렉토리에서 파일을 찾으십시오. .
  2. 해당 디렉토리 레벨에서만 찾으십시오. 즉, 되풀이하지 마십시오. -maxdepth 1
  3. 거기서 엔티티를 찾으십시오.

    • 파일 유형 : -type f
    • 과: -a
    • 이름이 ~:으로 끝나지 않는 ! -name *~ 곳 (여기서 !파일 이름과 일치하는 다음 지시문을 무시 함 -name *~)

    (유형에 전체 경기를하고 논리 단위로 표시 이름을 지정하려면, 그것은으로 괄호있어 (하고 )).

  4. 찾은 각 파일의 이름을 인쇄하십시오 -print.

쉘에 특수한 일부 문자가 쉘에 의해 해석되지 않도록 보호해야하므로 괄호와 뱅이 !백 슬래시로 이스케이프 처리되고 이름 패턴 *~이 작은 따옴표로 묶여 있습니다.

find명령은 옵션 사용을 통해 매우 강력한 미니 언어를 보유합니다. 예를 들어, 전체 파일 시스템 트리 (또는 트리)를 재귀 적으로 처리하되 스캔하는 동안 특정 디렉토리를 생략하도록 지시 할 수 있습니다. 파일의 여러 속성 (생성 또는 수정 시간 또는 크기 등)과 일치시킬 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.