점을 포함하지 않는 파일 이름에 텍스트 추가


9

다음과 같은 파일이 있습니다 :

english_api
english_overview
style.css

난 갖길 원해:

english_api.html
english_overview.html
style.css

., 터미널을 사용하여 디렉토리 내에서 점 ( )을 포함하지 않는 모든 파일에 텍스트를 추가하는 방법 입니다.

해당 폴더에는 많은 파일이 있습니다. 예를 들어 3을 썼습니다.

내가 대체, 말할 수 것 인 경우 .css.html해당 폴더에, 내가 사용합니다 :

rename .css .html *.css

그러나 실제로 무언가를 포함하지 않는 파일을 일치시키는 방법을 생각할 수 없습니다. 또한 rename명령을 사용하여 추가 (대체)하는 방법 ?

답변:


13

find명령을 사용해보십시오

find . -type f ! -name "*.*" -exec mv {} {}.html \;

현재 디렉토리에있는 파일 이름에 점이 포함되지 않은 파일의 이름을이 filename.html형식 ( 마지막에 추가).html 으로 바꿉니다 .

. -> 현재 디렉토리를 나타냅니다

-type f -> 파일에서만이 작업을 수행합니다.

! -name "*.*" -> 이름에 점이없는 파일 이름을 인쇄하십시오.

-exec mv {} {}.html -> find명령은 추출 된 파일 이름에 대해이 이동 (또는) 이름 바꾸기 작업을 수행합니다.

\; -> find명령 의 끝을 나타 냅니다.


6

배쉬에서는 사용할 수있는 확장 된 쉘을 globs의

for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done

( echo올바른 패턴과 일치하는지 확인한 후 제거하십시오 ). 확장 글러브가 아직 활성화되어 있지 않은 경우을 사용하여 활성화 할 수 있습니다 shopt -s extglob.

또 다른 옵션은 rename리터럴을 제외하는 정규식과 함께 perl 기반 함수를 사용하는 것입니다.

rename -nv 's/^[^.]+$/$&.html/' path/to/files/*

( n올바른 패턴과 일치하는지 확인한 후 옵션을 제거하십시오 ).


for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done명령은 디렉토리 이름도 바꿉니다.
Avinash Raj

2

이 같은 경우에 선호 mmv합니다. 우분투에서는 기본적으로 설치되지 않지만 sudo apt-get install mmv명령을 사용하여 설치할 수 있습니다 .

귀하의 경우 두 번 사용해야합니다.

  1. .html각 파일 이름 끝에 추가하여 현재 디렉토리에서 모든 파일의 이름을 바꾸십시오 .

    mmv -v '*' '#1.html'
    
  2. 이전에 이름이 하나 이상인 모든 파일의 이름을 다시 바꾸십시오 .(점).

    mmv -v '*.*.html' '#1.#2'
    

또는 한 줄로 :

mmv -v '*' '#1.html' && mmv -v '*.*.html' '#1.#2'

-v옵션은 필수가 아닙니다. mmv작업을 자동으로 수행 하지 않기 때문에 자세한 출력에만 사용합니다 .

자세한 내용 man mmv은 참조하십시오 .


1

Perl rename 명령 ( prename)을 사용하면 파일 이름에 점이 포함되어야한다는 조건을 추가 할 수 있습니다. Perl 스 니펫이 파일 이름을 변경하지 않으면 해당 파일은 그대로 유지됩니다. 이것을 작성하는 몇 가지 방법이 있습니다.

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *

-2

대답은 완벽합니다. 또한이 작업을 수행하는 다른 명령을 제공합니다.

ls -1 | grep -v "\." | awk '{print "mv "$0" "$0".html"}' | sh

일부 설명 :

ls - list directory contents

 -1     list one file per line

grep prints the matching lines.

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

Awk is mostly used for pattern scanning and processing. It searches one or more files to see if they contain lines that matches with the specified patterns and then perform associated actions.

노트 :

나는 당신의 시나리오를 시도하고 명령은 일을합니다.


6
공백, 탭, 줄 바꿈 등 모든 유형의 공백이 포함 된 파일 이름에서는 실패합니다. 일반적으로 구문 분석해서는 안됩니다ls .
terdon

맞습니다. 귀하의 의견에 감사드립니다. 그러나 동일한 명령으로 어떻게 해결할 수 있습니까
nux

3
당신은 정말로 할 수 없습니다. ls를 구문 분석하는 안전한 방법거의 없습니다 . 당신은 정말 사용하여 작업을 수행하려는 경우 awksh같은 것을 시도 printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh. 줄 바꿈으로 파일 이름이 여전히 깨지지 만 최소한 공백을 처리 할 수 ​​있습니다. 는 --당신이 파일 이름으로 시작이 경우에 필요하다 -.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.