forループはファイル名の前にディレクトリ名を追加します。

forループはファイル名の前にディレクトリ名を追加します。

私はこのトピックが以前に(ここや他の場所で)議論されていたことを知っていますが、bashスクリプト技術を使って道を見つけることを試みているので、ご了承ください。

次の問題を解決する必要があります。

私が持っていることを考えると:

ディレクトリ1

  • ファイル1
  • ファイル2
  • など...

ディレクトリ2

  • ファイル1
  • ファイル2
  • など...

ファイル名を変更したい。

ディレクトリ1

  • ディレクトリ1_ファイル1
  • ディレクトリ1_ファイル2
  • dir1_ちょっと...

ディレクトリ2

  • ディレクトリ2_ファイル1
  • ディレクトリ2_ファイル2
  • dir2_ちょっと...

これまで、私は次のような「探索的」bashスクリプトを書きました。

for d in `ls -d */`
 do
   #echo "$d"
   pre="${d:0:-1}"
   #echo "$pre"
   #cd "${d}"
   pushd "${d}"
    for f in *.jp2
     do
        #echo "${f}"
        echo "${pre}_${f}"
     done
   #cd - 
   #popd    
 done

エラーメッセージとは別に(かなり)うまく動作しているようです。

line 9: pushd: dir2/: No such file or directory

ここで、dir2はforループが検索した最後のディレクトリの名前です。

助けが必要ですか?私は何を見逃していますか?

ベストアンサー1

cdディレクトリに前後に移動する代わりに(popd大部分はpushdインタラクティブな使用のために作成されました):

#!/bin/sh

for name in */*; do
    [ ! -f "$name" ] && continue

    dir="$( basename "$( dirname "$name" )" )"
    newname="$dir/${dir}_${name##*/}"

    if [ ! -e "$newname" ]; then
        echo mv "$name" "$newname"
    fi
done

これは、現在のディレクトリ内のすべてのディレクトリにあるすべての名前を繰り返します。ファイル以外の項目はスキップし、ディレクトリのデフォルト名(パスのないディレクトリ名)をに抽出します。次に、dirパス名のデフォルト名部分(で置き換え可能)を使用して、$newnameファイルの新しいファイル名を設定します。$dir$name${name##*/}$( basename "$name" )

新しい名前がまだ使用されていない場合は、ファイル名が変更されます。

echo正しい操作を行う必要があることを確認したら、削除して実際にファイル名を変更してください。


別のディレクトリで一連の操作を実行した後に戻るには、次のようにします。

( cd dir
  action
  action 
  action )

ディレクトリを変更しても効果はありません( ... )


また見なさい:なぜ`ls`を解析しないのですか?

おすすめ記事