私はこのトピックが以前に(ここや他の場所で)議論されていたことを知っていますが、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`を解析しないのですか?