2016-06-15 4 views
1

폴더에있는 모든 .txt 파일의 복사본을 만들려고하지만 이름이 바뀌므로 .html 파일이됩니다..을 포함하는 문자열을 바꿉니다. sed 사용

for f in my-txt-folder/*.txt 
do 
    a="$(echo $f | sed s/.txt/.html/)" 
    cp "$f" "$a" 
done 

이 내가 그것을 실행할 때 나는 오류

my.html-folder/file.txt: No such file or directory. 

나는 그것이 바깥 쪽 폴더에있는 "-txt을"의 이름을 변경하기 때문에이 오류가납니다 알고를 얻을, 지금까지 내 코드입니다 ,하지만 어떻게 그 일을 그만 두겠습니까? 나는 또한 "\ .txt"를 대체하는 데 노력했지만 여전히 폴더 이름이 일치한다고 생각합니다. ".txt"만 일치 시키려면 어떻게합니까? 누구나 묻기 전에 폴더로 들어가서 스크립트를 실행하면 안됩니다.

+2

'sed's/\. txt/.html/''또는'sed's/.txt $/.html/''(백 슬래시를 피하는 역 슬래시 '.txt'는 파일 이름을 끝내고, glob는'.'가'.'과 일치 함을 보장합니다.) ... 패턴 주위에 작은 따옴표를 사용합니다. 사용하지 않으려면 두 개의 백 슬래시를 사용해야합니다. 또한, 파일 이름을 인용 할 필요가있을 때마다,'a = "$ (echo"$ f "| sed.s/.txt/.html /)"'- 매번 이중 인용 부호로 묶음 필요에 따라 –

+0

또한 regex [here] (https://regex101.com/r/aP3bQ6/2)로 재생할 수 있습니다 ... – anishsane

답변

2

경기, 예를 들어

for f in my-txt-folder/*.txt 
do 
    a="$(echo $f | sed -e 's/\.txt$/.html/')" 
    cp "$f" "$a" 
done 

이전에는 "." 와일드 카드 문자 인 sed과 일치했으며 끝 부분에 패턴을 고정하지 않았습니다.

방금 ​​게시 된 heemayl의 bash에 다른 해결책이 있습니다. all-shell 솔루션의 장점은 sed의 미세한 점을 아직 배울 필요가 없다는 것입니다.

+0

\ .txt의 끝에있는 $는 무엇을합니까? – annedroiid

+0

$는 행의 끝 앵커입니다. – vielmetti

+0

마찬가지로 줄의 끝 부분에있는 문자열 만 찾습니다. – annedroiid

5

당신은 cp -ing 동안 파일 이름 및 매개 변수 확장을 반복하는 for 구조를 사용할 수 있습니다

for file in *.txt; do cp -i "$file" "${file%.*}".html; done 

${file%.*} 매개 변수 확장 패턴, 끝에서 .txt을 제거 파일 이름의 파일 부분을 가져옵니다. 따라서 파일 이름이 foobar.txt 인 경우 foobar을 입력 한 다음 .html을 입력하면 foobar.html이됩니다.

예 : 행의 끝에

$ ls *.txt 
bar.txt foo.txt 

$ for file in *.txt; do cp -i "$file" "${file%.*}".html; done 

$ ls *.{txt,html} 
bar.html bar.txt foo.html foo.txt 
+0

$ {file %. *} 구문이 작동했습니다. 보시다시피 이미 for 루프를 사용하고 있었으므로 이름을 변경하지 않았습니다. 감사! – annedroiid

관련 문제