私は単なるunix時代のファイルをたくさん持っています。問題は、ファイル名がmillisになり、ディレクトリをスキャンするプログラムが秒単位であると予想されることです。ですから、.txt拡張子の前に最後の3桁を削除するために、すべてのファイルの名前を変更する必要があります。 IE:Bash Regexはファイル名を変更します
1461758015598.txt - > 1461758015.txt
私はこれを行う方法を確認していないので、私は正規表現とはbashに新しいです。ここで
私は単なるunix時代のファイルをたくさん持っています。問題は、ファイル名がmillisになり、ディレクトリをスキャンするプログラムが秒単位であると予想されることです。ですから、.txt拡張子の前に最後の3桁を削除するために、すべてのファイルの名前を変更する必要があります。 IE:Bash Regexはファイル名を変更します
1461758015598.txt - > 1461758015.txt
私はこれを行う方法を確認していないので、私は正規表現とはbashに新しいです。ここで
が一つの方法だ:do
とdone
間
for f in *.txt; do
mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done
、それは、一度に1つのファイルを見ていて、現在のファイルの名前はPARAMTER f
です。 "$f"
は、そのパラメータの値です。変更されません。 "${f/[0-9][0-9][0-9].txt/.txt}"
は、置換が適用されたパラメータの値です。.txt
を使用して「3桁の数字を.txt
」に置き換えます。
@anubhavaが指摘しているように、2回以上実行すると、ファイル名の桁の長さが引き延ばされますので、そうしないでください。グロブパターンを強化することによって、それを等号にすることができます。これは少し扱いにくいです:
for f in [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].txt; do
mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done
だから、あなたはそれをよりコンパクトにするために外部ツールを使用する場合があります(これはディレクトリ内のファイル名にはスペースや改行がないと仮定し):
for f in $(ls -1 | egrep '^[0-9]{13}\.txt$'); do
mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done
あなたはwhile read
ループを使用して、単に「ノー改行」に制限を減らすことができます
ls -1 | egrep '^[0-9]{13}\.txt$' | while read f; do
mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done
マークの答えは、オプションの数をカバーしています。
しかし、あなたが再帰的な何かをしたい場合は、私はこのようなfind
ベースのソリューションで行くと思います:
find -E . -regex '.*/[0-9]{13}\.txt' -exec \
sh -c 'set -; mv -v "$0" "${0%???.txt}.txt"' "{}" \;
注:
-E
オプションを持っているのFreeBSDを、使用していますEREを使用するように-regex
に伝えてください。古いOSを使用している場合は、EREをBREに変換する必要があります。${../../}
の代わりに${..%..}
を使用しています。このPOSIXは、bashに依存するのではなく、準拠しています。find
)。あなたはfind
の使用を避けることを好むだろうが、まだbashで再帰的な何かをしたい、あなたはglobstar
オプションを使用することができれば:
shopt -s globstar extglob
for f in **/+([0-9]).txt; do
[[ $f =~ ^[0-9]{13}\.txt$ ]] && mv -v "$f" "${f%...\.txt}.txt"
done
注globstar
はbashのバージョン4
Aに依存していることを再帰的に動作するfailsafe pythonの代替:http://stackoverflow.com/a/39698169/191246 – ccpizza