ls 및 mv와 함께 ms-dos 스타일 와일드 카드를 사용하려면 어떻게해야합니까?


9

나는 MS-DOS 배경에서 오는 불행을 가지고 있지만 적어도 리눅스가 얼마나 강력한 지 감사하게 생각합니다. Linux-Fu를 준비하는 데 노력하고 있지만 DOS로 수행 할 수있는 몇 가지 작업 이 Linux에서 가장 쉽게 달성 할 수 있는 방법이 확실하지 않습니다 .

여러 파일 이름 바꾸기-두 개의 와일드 카드 사용

c:\> dir

Directory of c:\
    file1.txt
    file2.txt
    file3.txt
    file4.txt

c:\>rename *.txt *.bak

c:\> dir

Directory of c:\
    file1.bak
    file2.bak
    file3.bak
    file4.bak

나는 find -exec여기서 사용할 수 있다는 것을 알고 있지만 더 짧은 구문을 사용할 수 있습니다-아마도 mv특별한 플래그 또는 구문과 함께? 리눅스의 첫 번째 문제에는 문제가 없어야하기 때문에 두 번째 * 와일드 카드 라고 생각합니다 (즉, 와일드 카드를 사용하여 이름을 바꾸려는 파일을 선택하는 방법을 알고 있습니다)

단일 파일 이름 바꾸기-하나의 와일드 카드 사용

c:\> dir

Directory of c:\
    file1.txt

c:\>rename file1.txt *.bak

c:\> dir

Directory of c:\
    file1.bak

길고 다루기 힘든 파일 이름을 바꿀 때 특히 유용합니다. 나는 mv file1.txt $1.bak결국 file1.txt.bak받아 들일 수있는 것으로 생각 했지만 $1쉘 명령으로 매개 변수를 인라인으로 참조 할 수 있는지 확실하지 않습니다 . 이 특별한 경우에도 ms-dos *가 파일 이름의 일부에 대해 일종의 캡처 / 바꾸기 일치로 사용되도록 와일드 카드를 별표로 만드는 방법이 편리합니다 .

와일드 카드를 사용하여 디렉토리 목록 필터링

c:\> dir

Directory of c:\
    file1.txt
    file2.txt
    file3.txt
    file4.txt
    text.txt
    \temp       (directory) 

c:\> dir file*

Directory of c:\
    file1.txt
    file2.txt
    file3.txt
    file4.txt

c:\> t*

Directory of c:\
    text.txt
    \temp       (directory) 

그 작업을 수행하는 올바른 구문이 무엇인지 ls, 또는 가능한지 확실하지 않습니다 . 내가 비슷한 ls t*것을하면로 시작하는 디렉토리로 돌아갑니다 t. 내 해결 방법 중 하나를 사용하고있다 find . --max-depth 1 -iname "t*"처럼 또는 무언가 ls -al | grep t로 짧고 간단하다 어느 쪽도 아니 - dir t*입니다.

마지막으로, 나는 긴 명령을 더 짧게 만들기 위해 별칭을 설정할 수 있다는 것을 알고 있지만 때로는 원격 시스템에 연결되어 있거나 작동하기 때문에 이러한 작업을 수행하기 위해 즉시 사용 가능한 linux-fu를 배우고 싶습니다. 새로운 기계에.

그래서 내가 어떻게 할 수 mvls파일 같은 방법으로 내가하는 데 사용 dirrename파일?

답변:


15

Windows cmd와 POSIX 셸 의 근본적인 차이점 중 하나는 와일드 카드 확장을 담당하는 사람입니다. 쉘은 요청한 실제 명령을 시작하기 전에 필요한 모든 확장을 수행합니다. cmd 대부분 와일드 카드 패턴을 수정되지 않은 명령으로 전달합니다. (예외가 있다고 생각하고 대부분의 환경에서 환경 변수가 확장되기 때문에 대부분 말합니다.) 이렇게하면 매우 까다로운 rename구문과 동일한 구문으로 작동 하는 것을 작성할 수 있습니다 cmd.

그러나 renameLinux에는-완전히 다른 인수를 사용하여 매뉴얼 페이지를 확인하십시오 (man 시스템은 다소 간결하며 시스템 renameutil-linux패키지에서 제공되며 널리 사용 가능해야 함). 첫 번째 이름 변경은 다음과 같이 수행됩니다.

rename .txt .bak *.txt

쉘은 *확장을 수행하므로 rename실제로는 다음과 같이 호출되었다고 생각합니다.

rename .txt .bak file1.txt file2.txt file3.txt ...

따라서 단일 파일 버전을 추측 할 수 있습니다.

rename .txt .bak file1.txt

사용하고 싶지 않고 rename직접 구현하려면 해당 기능을 만들 수 있습니다. 파일 확장자 만 변경하고 단일 파일 이름 바꾸기에 대해서는 다음을보십시오.

$ function chext() {
  newext="$1"
  file="$2"
  newfile="${file%.*}$newext"
  echo mv "$file" "$newfile"
}
$ chext .csv test.txt
mv text.txt text.csv

$newfile하위 확장을 사용하여 빌드하여 원래 확장을 제거한 다음 새 확장을 연결합니다. 이 기능을 확장하여 여러 파일을 비교적 쉽게 처리 할 수 ​​있습니다.


당신에 관해서 ls질문 사용 -d스위치를. ls디렉토리의 내용이 나열 되지 않습니다 .

데모:

$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:29 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.csv
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

와일드 카드 이름 변경

$ rename .csv .txt f*
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

단일 파일 이름 바꾸기

$ rename .txt .csv f1.txt 
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

기본 ls

$ ls -l t*
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

test:
total 0
-rw-r--r-- 1 owner users 0 Jan  7 17:33 dont_show_me_please

ls 디렉토리를 검사하지 않는

$ ls -ld t*
drwxr-xr-x 2 owner users 4096 Jan  7 17:33 test
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

아주 좋아요! 나는 방금 리눅스 리눅스로 벨트를 움직 였다고 생각한다! 감사!
cwd

사용의 간단한 기능 또는 스크립트는 당신이 할 때 어떻게되는지 : 팁은이와 비트 (그리고 피할 함정)를 진행하는 somefunc *.Ext그 패턴이 어떤 파일과 일치하지 않는 경우, 당신은 주위에 패턴을 전달하는 관리하는 경우 인용으로 플레이 (볼 기능간에 확장하지 않고). 안전 팁 : 글 로빙 / 쉘 확장 실험을하는 동안 아무데도 사용 하지 마십시오rm :-)
Mat

4

와일드 카드와 관련하여 명심해야 할 사항은 쉘에 의해 확장된다는 것입니다. 응용 프로그램은 와일드 카드를 사용했는지 또는 이름을 입력했는지 알 수 없습니다. 예를 들어을 입력 rename *.txt *.bak하면 rename명령에 다음과 같은 내용이 표시 rename file1.txt file2.txt existingfile.bak됩니다. 정보가 충분하지 않습니다.

ls더 간단하기 때문에 먼저 질문을 다룰 것 입니다. 원하는 이름 만 일치 ls하면 셸이 이미 확장을 수행하고 있기 때문에 필요하지 않습니다 .

echo t*

파일에 대한 자세한 정보가 필요하면 -d옵션을 로 전달하여 ls디렉토리의 내용을 나열하지 않도록 지시하십시오.

ls -ld t*

최초의 유닉스 시스템은 파일명을 제공하지 않았기 때문에 파일명 변경을위한 표준 유틸리티는 없습니다. 파일 이름을 바꾸는 이식 가능한 방법은 루프를 사용하며 약간 장황합니다.

for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done

파일 이름을 바꾸는 몇 가지 일반적인 유틸리티가 있습니다.이 유틸리티 중 어느 것도 주어진 유닉스 시스템에 설치되는 것이 보장되지는 않지만 설치가 쉽습니다. 주요 내용은 다음과 같습니다.

  • rename로부터 util-linux모든 비 임베디드 리눅스 시스템 (그리고 다른 곳)로 볼 수 있습니다 제품군. 데비안과 파생어 (우분투 포함)에서는이 명령을이라고 rename.ul합니다. .txt최종 확장 이외의 항목이없는 경우 다음을 작성할 수 있습니다.

    rename .txt .bak *.txt
    
  • rename데비안과 파생어가 제공하는 Perl 스크립트입니다 /usr/bin/rename. 임의의 Perl 명령에 따라 파일 이름을 바꿀 수 있습니다.

    rename 's/\.txt\z/\.bak/' *.txt
    
  • mmv여러 이름 기반 패턴에 따라 파일의 이름을 바꾸고, 복사하고, 링크 할 수 있으며 대상 이름이 이미 존재하는 경우 발생하는 것과 관련된 많은 옵션이 있습니다. 쉘에서 와일드 카드를 확장하지 못하도록하려면 인용 부호를 사용해야합니다.

    mmv '*.txt' '#1.txt'
    
  • zmv쉘이 zsh 인 경우에만 사용할 수 있는 zsh 함수입니다. 임의의 zsh 패턴과 일치 할 수 있으므로 와일드 카드뿐만 아니라 임의의 정규식에 따라 파일 이름을 일치시킬 수 있으며 날짜 및 크기와 같은 다른 기준으로 파일을 일치시킬 수 있습니다. zmv복사 및 링크 할 수도 있습니다.

    zmv '(*).txt' '$1.txt'
    

사용하는 머신을 약간 제어 할 수 있다면 zsh를 쉘로 사용하고 (bash보다 다른 이점이 있습니다) 다음 줄을 다음과 같이 입력하십시오 ~/.zshrc.

autoload -U zmv
alias zmv='noglob zmv -w'
alias zcp='zmv -C'
alias zln='zmv -L'
alias zsy='zmv -Ls'

noglob쉘이 명령 인수에서 와일드 카드를 확장하지 않도록 지시하는 zsh 기능입니다. 이렇게하면 쓸 수 있습니다 zmv *.txt \$1.txt( $대체 텍스트 를 항상 보호해야 합니다).

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