나는 불행하게도 MS-DOS 경험이 있지만 적어도 Linux가 얼마나 강력한지 맛보게 해주었습니다. 나는 Linux-Fu를 동등한 수준으로 끌어올리려고 노력했지만 DOS로 할 수 있는 일이 몇 가지 있는데 어떻게 해야 할지 잘 모르겠습니다.가장 쉬운리눅스의 경우:
여러 파일 이름 바꾸기 - 두 개의 와일드카드 사용
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
특수 플래그나 구문과 함께 사용할 수 있습니까? 제 생각엔 여기서 핵심은두번째 *
Linux의 와일드카드는 첫 번째 와일드카드에서 문제가 되지 않습니다. (즉, 와일드카드를 사용하여 이름을 바꾸려는 파일을 선택하는 방법을 알고 있습니다.)
단일 파일 이름 바꾸기 - 와일드카드 사용
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를 배우고 싶습니다. 새로운 기계.
그렇다면 이전과 같이 파일 mv
작업을 어떻게 사용할 수 있습니까?ls
dir
rename
답변1
Windows 셸과 POSIX 셸의 근본적인 차이점 중 하나 cmd
는 와일드카드 확장을 담당하는 사람이 누구인지입니다. 쉘은 요청한 실제 명령을 실행하기 전에 필요한 확장을 수행합니다.cmd
최대와일드카드 패턴을 변경하지 않고 명령에 전달합니다. (예외가 있다고 생각하고 대부분의 경우 환경 변수가 확장된다고 생각하기 때문에 가장 많이 말합니다.) 이렇게 하면 에서 rename
와 동일한 구문으로 작동하는 프로그램을 작성하게 됩니다 cmd
.
그러나 Linux용도 있습니다 rename
. 완전히 다른 매개변수를 사용하는 매뉴얼 페이지를 확인하세요(내 시스템에서는 약간 간결하며 널리 사용해야 하는 내 시스템의 패키지 rename
에서 제공됩니다 ). util-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
답변2
와일드카드에 대해 이야기할 때 기억해야 할 한 가지는 와일드카드가 셸에 의해 확장된다는 것입니다. 응용 프로그램은 와일드카드를 사용했는지 또는 이름을 입력했는지 알지 못합니다. 예를 들어 를 입력하면 rename *.txt *.bak
명령 rename
에 다음과 같은 내용이 표시됩니다 rename file1.txt file2.txt existingfile.bak
. 이 정보로는 계속 진행할 수 없습니다.
이 문제는 더 간단하기 때문에 먼저 다루겠습니다 ls
. 원하는 것이 이름 일치뿐이라면 ls
쉘이 이미 확장을 수행하고 있으므로 그럴 필요가 없습니다 .
echo t*
파일에 대한 추가 정보를 원할 경우 옵션을 전달하여 -d
디렉터리 ls
내용을 나열하지 않도록 지시하세요.
ls -ld t*
파일 이름을 바꾸는 표준 유틸리티는 최초의 UNIX 시스템과 함께 제공되지 않았기 때문에 없습니다. 파일 이름을 바꾸는 이식 가능한 방법은 루프를 사용하며 약간 장황합니다.
for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done
파일 이름을 바꿀 수 있는 일반적으로 사용되는 유틸리티가 여러 가지 있지만 특정 UNIX 시스템에 설치가 보장되는 것은 아니지만 모두 설치가 쉽습니다. 주요 내용은 다음과 같습니다.
rename
이util-linux
제품군에서 제공되며 모든 비임베디드 Linux 시스템에서 작동합니다(다른 시스템에서는 작동하지 않음). Debian 및 그 파생 제품(Ubuntu 포함)에서는 이 명령을 이라고 합니다rename.ul
..txt
마지막 확장 외에 아무것도 나타나지 않으면 다음과 같이 작성할 수 있습니다.rename .txt .bak *.txt
rename
Debian 및 그 파생 제품에서 사용할 수 있는 Perl 스크립트입니다/usr/bin/rename
. Perl 명령을 기반으로 파일 이름을 바꿀 수 있습니다.rename 's/\.txt\z/\.bak/' *.txt
mmv
에는 여러 이름 기반 모드에 따라 파일 이름을 바꾸고, 복사하고, 연결할 수 있으며 대상 이름이 이미 존재할 때 발생하는 상황과 관련된 많은 옵션이 있습니다. 쉘에서 와일드카드 문자가 확장되는 것을 방지하려면 따옴표를 사용해야 합니다.mmv '*.txt' '#1.txt'
zmv
는다루기 힘든쉘이 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
보호해야 합니다 ).$