2016-06-15 4 views
1

フォルダ内のすべての.txtファイルのコピーを作成しようとしていますが、名前が.htmlファイルに変更されています。私はそれを実行したときにaを含む文字列を置換します。 sedを使用

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

これは、これまでの私のコードでは、しかし、私はそれが内包しているフォルダ内の「-txtを」名前を変更するので、私はこのエラーを取得しています知っているエラーに

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

を取得しますしかし、私はそれをどうやって止めるのですか?私はまた、 "\ .txt"を置き換えようとしましたが、それでも囲みフォルダ名は一致していると考えています。どうすれば ".txt"にマッチするだけですか?だれかが尋ねる前に、私はフォルダにドリルダウンしてそこからスクリプトを実行することはできません。

cp -ingしているときは、ファイル名やパラメータ展開を反復する for構文を使用することができます
+2

'sed '/ \ txt/.html /''や 'sed 's/.txt $/.html /''のように '.'をエスケープするバックスラッシュ(バックスラッシュを避ける'.txt'がファイル名を終了し、globは' .'が '.'とマッチすることを保証します)、または...パターンの周りに小さな引用符を使うことに注意してください。それらを使用しない場合は、2つのバックスラッシュを使用する必要があります。また、ファイル名を引用する必要がある場合は、 '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には、もう1つの解決策があります。オールシェルソリューションの利点は、まだsedの細かい点を習得する必要がないことです。

+0

\ .txtの最後にある$は何をしますか? – annedroiid

+0

$は行末アンカーです。 – vielmetti

+0

これは、行末の文字列だけを検索するためですか? – annedroiid

5

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

関連する問題