2017-01-12 12 views
2

親フォルダ内には、スクリプトと多数のフォルダがあります。これらのフォルダの中には、任意の名前のテキストファイルが含まれています。ファイル名を変更するためにスクリプトを実行すると、名前が変更された新しいファイルが親フォルダに格納されます。新しく名前を付けたファイルが元のフォルダに残るようにスクリプトを書き込むにはどうすればよいですか?同じ場所を維持しながら、サブディレクトリ内のすべてのファイルの名前を変更します。

for file in $(find . -type f -name '*txt') ; do 
    name=$(parse text for correct name) 
    mv "$file" "${name}.txt" 
done 
+1

lineされ、元のファイル名で読み取り):http://mywiki.wooledge.org/ParsingLs – muru

答えて

1

mvコマンドでディレクトリを指定しないという問題。あなたのスクリプトは親ディレクトリから呼び出されるので、名前が変更されたファイルはそこに終わります。

それを見直して、このよう:

for file in $(find . -type f -name '*txt'); do 
    # grab the directory of the file being renamed 
    dir=$(dirname "$file") 
    name=$(parse text for correct name) 
    mv "$file" "$dir/${name}.txt" 
done 

が提案を1として、あなたはループをこのように書き換えることができます。いずれかの場合、これは、あなたのファイル名に空白やグロブからあなたを守ります:

while read -r file; do 
    dir=$(dirname "$file") 
    name=$(parse text for correct name) 
    mv "$file" "$dir/${name}.txt" 
done < <(find . -type f -name '*txt') 
2

をあなたの最大の課題は、単にあなたがpath/name.txtに元のファイルを移動することができますのorignal filenameからpathを分離しています。パラメータの拡張/部分文字列の削除をとすると、タスクを実行できます。ファイルは任意の名前が付けられていた場合は、 `$(見つける)で、Fは`行わない、

while read -r line; do 
    name=$(parse text for correct name) # parse your new name as needed 
    fname="${line##*/}"     # isolate the filename in line 
    dname="${line%"$fname"}"    # remove fname from end of line for path 
    mv "$line" "${dname}/${name}.txt" 
done < <(find . -type f -name '*txt') 
関連する問題