0

次のようなフォルダ構造のディレクトリがあります。

-- DATA -- ABD 1231345 -- 01-08-12 // date in mm-dd-yy format
                       -- 03-09-12
                       -- 06-11-12

        -- DEF 4859480 -- 02-10-12
                       -- 05-10-12
                       -- 07-10-12

DATAこのフォルダの名前を次のようにまとめて変更したい

-- DATA -- ABD 1231345 -- 2012_01_08 // date in yyyy_mm_dd format with underscore
                       -- 2012_03_09
                       -- 2012_06_11

        -- DEF 4859480 -- 2012_02_10
                       -- 2012_05_10
                       -- 2012_07_10

Mac OSX / UNIXでコマンドラインを使用して実行する方法についての提案はありますか?

4

4 に答える 4

2

forループとを使用してawk、各ファイル名を指定した形式に解析してmvから、元の名前を新しい名前に変更できます。

for dir in DATA/*; do \
    pushd "$dir"; # change directory \
    for file in *; do \
        path=`echo $file | awk -F- '{print "20"$3"_"$1"_"$2}'`; \
        mv $file $path; # "rename" the file \
    done; \
    popd; # restore original directory \
done;

これは上のフォルダで実行できますDATA。で直接実行する場合はDATA、最初のループを更新して、のfor dir in *; do代わりに読み取りますDATA/*awk(空白の代わりに)区切り文字としてを使用するように指示し-、「mm-dd-yy」から「20yy_mm_dd」までの文字列を再構築します。

pushdおよびを使用popdすると、スクリプトで現在のディレクトリをDATApushd)内の各サブディレクトリに変更できます。その後、必要なすべてのファイルを移動すると、元の(popd)に戻ります。これを行うと、多くの解析が節約されます-ディレクトリパスなどを保存しようとする労力。

于 2012-09-12T20:11:55.063 に答える
1

文字列操作配列を使用して、bashのみでそれを行うことができます。

何かのようなもの:

for f in * ; do
  parts=(${f//-/ })
  mv "$f" "20${parts[2]}_${parts[1]}_${parts[0]}"
done

このサイトを検索して、ディレクトリに再帰するさまざまなオプションを探します。例: ディレクトリをトラバースするシェルスクリプト

于 2012-09-12T20:15:35.090 に答える
1

次のコマンドを使用してdate、ファイル名を変換します。

$ date -j -f %m-%d-%y 01-08-12 +%Y_%m_%d
2012_01_08

ファイルへのアクセスは少し注意が必要です。長いファイルパスを処理しないように、ディレクトリを切り替えるだけです。

for d in DATA; do
    pushd "$d"
    for f in *; do
        new_f=$(date -j -f %m-%d-%y $f +%Y_%m_%d)
        mv "$f" "$new_f"
    done
    popd
done
于 2012-09-12T20:20:28.580 に答える
0

このサイトは良いスニペットを提供します

for i in *.avi; do j=`echo $i | sed 's/(\d{2})-(\d{2})-(\d{2})/20\3_\1_\2/g'`; mv "$i" "$j"; done
于 2012-09-12T20:15:07.213 に答える