~(백업 파일)로 끝나는 파일을 나열하지 마세요.

~(백업 파일)로 끝나는 파일을 나열하지 마세요.

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

나는 명령을 사용해 보았습니다 :

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

답변1

GNU 구현 (대부분의 Linux 시스템에서 사용 가능)에는 백업을 무시하는 ls옵션이 있습니다 .-B

ls --ignore-backups

답변2

ls -l | grep -v ~

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

ls -l | grep -v "~"

물론 이렇게 하면 파일 이름 중간이나 출력의 다른 위치에서도 물결표가 있는 출력 줄이 제거됩니다 ls(사용자 이름, 날짜 등에 나타날 가능성은 낮지만). 물결표로 끝나는 파일을 무시하고 싶다면 다음을 사용할 수 있습니다.

ls -l | grep -v "~$"

답변3

Bash를 사용하는 경우 extglob활성화되어 있는지 확인하세요.

shopt -s extglob

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

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

kshglobzsh에서는 해당 옵션을 사용하거나 자체 확장 glob을 사용하여 동일한 작업을 수행할 수 있습니다.

setopt extended_glob
ls -d -- ^*~

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

ls -d -- *[^~]

그러나 일반적인 아이디어는 ls --ignore-backups.

답변4

다른 답변에서 언급했듯이 문제가 있는 이유는 물결표를 인용하거나 이스케이프 처리하지 않았기 때문일 수 있습니다.

특정 사용 사례의 경우 비슷한 작업을 수행하기 위해 셸 파일 이름 확장을 사용했습니다. 저는 2003년경부터 이 프로그램을 사용해 왔습니다. 즉, 다양한 유형의 시스템에서 다양한 쉘 구현과 함께 작동한다는 의미입니다. ( -C정렬된 열에 멋진 표시를 원하기 때문에 여기서도 사용합니다 )

ls -C *[!~]

(물론, 쉘 파일 이름 확장을 사용할 때의 한 가지 제한 사항은 (비백업) 파일이 많은 디렉토리로 인해 확장이 사용 가능한 매개변수 목록 크기를 초과하게 된다는 것입니다. 그러나 대부분의 최신 시스템에서는 이 제한이 상당히 높지만 일반적으로 250KB 이상, 때로는 그 이상)

관련 정보