수천 개의 텍스트 파일 이름을 텍스트 파일의 첫 번째 단어와 파일 확장자(.txt)로 바꾸려면 터미널을 사용해야 합니다. 모든 파일은 디렉토리에 있으며 현재 "xx0001.txt"부터 "xx9999.txt"까지의 패턴으로 이름이 지정됩니다.
각 파일의 첫 번째 단어는 "##221251" 패턴입니다. 따라서 파운드 기호를 주석 처리해야 하는 데서 문제가 발생한 것일 수도 있습니다.
나는 시도했다:
rename File.ReadAllText('*.txt').split(' ')[0]
오류가 발생합니다.
zsh: no matches found: File.ReadAllText(*.txt).split( )[0]
도움을 주셔서 미리 감사드립니다. 저는 진짜 초보자입니다.
답변1
단어가 SPC, TAB 또는 NUL로 구분되어 있고 첫 번째 단어가 첫 번째 줄에 있다고 가정하고 다음을 시도해 보세요.
for file (*.txt) {
read -r word rest < $file && mv -i -- $file $word.txt
}
SPC로만 분할하려면 read
로 바꾸십시오 IFS=' ' read
.
이 코드가 어떤 언어로 작성되었는지는 모르지만 구문 rename File.ReadAllText('*.txt').split(' ')[0]
은 확실히 아닙니다 zsh
(내가 아는 다른 쉘의 구문도 아닙니다).
zsh
코드가 수행하는 작업을 보다 직접적으로 번역하면 다음과 같습니다.
for file (*.txt) mv -i -- $file ${$(<$file)[1]}
메모리의 전체 파일을 읽고 분할하지만 오류 검사를 많이 수행하지는 않습니다. 분할은 SPC, TAB, NUL 또는 NL에서 이루어지며 첫 번째 줄의 첫 번째로 제한되지 않습니다.
더 빠르게 수행하려면 zmodload zsh/files
명령을 mv
내장 버전으로 대체하는 사전 실행을 수행할 수 있습니다(호출 시 비용이 많이 드는 포크와 실행 파일을 절약함).
rename
perl
그 자체는 적어도 1980년대부터 출시된 샘플 프로그램의 이름입니다 . 매개변수는 perl
대체 이름을 계산하는 데 사용되는 코드입니다. 모든 시스템에 이 rename
명령이 제공되는 것은 아니며 일부 시스템에서는 rename
완전히 다릅니다. 당신이 이 사람이라면 rename
, perl
이렇게 할 수 있습니다:
rename '
if (open FILE, "<", $_ and my $line = <FILE>) {
chomp $line;
my @words = split " ", $line;
$_ = "$words[0].txt" if @words;
}' ./*.txt
perl
여기에는 내부 내용이 언어 코드 로 그대로 전달되도록 작은따옴표가 사용되었습니다 perl
.
*.txt
다음으로 변경 *.txt(.)
하거나 *.txt(-.)
고려해 볼 수도 있습니다.정기적인파일(디렉터리, fifo, 장치 및 기타 비전통적인 유형의 파일 건너뛰기)
답변2
현재로서는 vim
다음을 수행합니다(더러워도).
:$!ls *.txt
.txt
그러면 디렉토리에 있는 모든 파일의 목록이 제공됩니다.
:%norm A `sed 1q < | cut -f1 -d' '`
이는 파일의 첫 번째 단어(또는 공백이 뒤따르는 첫 번째 단어, [보통 같은 것으로 간주됨])를 가져오는 명령 템플릿을 추가하며 빠르게 완료됩니다.... ....
:%norm 0vf yf<p
이전에 생성한 목록에서 파일 이름을 가져와서 붙여넣습니다.<
:%norm Imv˽
각 줄의 시작 부분에 이동 명령과 공백을 추가합니다.
:w command.sh
이것을 chmod +x command.sh
전달하고 실행할 수 있는 스크립트 로 저장하세요../command.sh
경고하다:
위생은 전혀 이루어지지 않았습니다. 즉, 파일의 첫 번째 단어가 고유한 이름인지 확인하지 않습니다. 이는 귀하의 지원서에 따라 제공될 수 있지만 일반적으로 그렇지 않습니다. 따라서 파일 이름을 해당 내용의 첫 번째 단어로 바꾸면 파일이 서로 덮어쓰일 수 있습니다. 따라서 이는 권장되지 않습니다.