0

再構築する必要のあるディレクトリがたくさんあります。それらは次のような形式になっています。

./1993-02-22 - The Moon - Tallahassee, FL/**files**
./1993-02-23 - The Moon - Tallahassee, FL/**files**
./1993-02-24 - The Moon - Tallahassee, FL/**files**
./1993-02-25 - The Moon - Tallahassee, FL/**files**
./1993-03-01 - The Test - Null, FL/**files**

各フォルダの先頭から日付を抽出したい。たとえば、regex:([0-9]{4})\-([0-9]{1,2})\-([0-9]{1,2})で、ディレクトリを に再フォーマットし./year/month/dayます。

したがって、次のように出力されます。

./1993/02/22/**files**
./1993/02/23/**files**
./1993/02/24/**files**
./1993/02/25/**files**
./1993/03/01/**files**

コマンドラインからそれを行うにはどうすればよいですか?

4

4 に答える 4

1
于 2013-09-06T23:01:30.363 に答える
1

ファイルが「old」フォルダーに保存されていると仮定すると、シェルスクリプトを作成できます(スペースを含むファイル名で問題がある「for」ループの使用は避けてください):

mkdir -p new
ls -d -1 old/*/* | while read oldfile; do
    newfile=`echo "$oldfile" | sed -r 's#^old/([0-9]{4})\-([0-9]{1,2})\-([0-9]{1,2})(.*)$#new/\1/\2/\3/\4#'`
    newdir=` echo $newfile | sed 's#/[^/]*$##'`
    echo "Creating \"$newdir\""
    mkdir -p "$newdir"
    echo "Moving files from \"$oldfile\" to \"$newfile\""
    cp -r "$oldfile" "$newfile"
done

スクリプトの出力:

Creating "new/1993/02/22/ - The Moon - Tallahassee, FL"
Moving files from "old/1993-02-22 - The Moon - Tallahassee, FL/test" to "new/1993/02/22/ - The Moon - Tallahassee, FL/test"
Creating "new/1993/02/23/ - The Moon - Tallahassee, FL"
Moving files from "old/1993-02-23 - The Moon - Tallahassee, FL/test" to "new/1993/02/23/ - The Moon - Tallahassee, FL/test"
Creating "new/1993/02/24/ - The Moon - Tallahassee, FL"
Moving files from "old/1993-02-24 - The Moon - Tallahassee, FL/test" to "new/1993/02/24/ - The Moon - Tallahassee, FL/test"
Creating "new/1993/02/25/ - The Moon - Tallahassee, FL"
Moving files from "old/1993-02-25 - The Moon - Tallahassee, FL/test" to "new/1993/02/25/ - The Moon - Tallahassee, FL/test"
Creating "new/1993/03/01/ - The Tes - Null, FL"
Moving files from "old/1993-03-01 - The Tes - Null, FL/test2" to "new/1993/03/01/ - The Tes - Null, FL/test2"

そして、あなたの新しいツリーは...実際には「新しい」フォルダにあります:

$ tree old new
old
├── 1993-02-22 - The Moon - Tallahassee, FL
│   └── test
├── 1993-02-23 - The Moon - Tallahassee, FL
│   └── test
├── 1993-02-24 - The Moon - Tallahassee, FL
│   └── test
├── 1993-02-25 - The Moon - Tallahassee, FL
│   └── test
└── 1993-03-01 - The Tes - Null, FL
    └── test2
new
└── 1993
    ├── 02
    │   ├── 22
    │   │   └──  - The Moon - Tallahassee, FL
    │   │       └── test
    │   ├── 23
    │   │   └──  - The Moon - Tallahassee, FL
    │   │       └── test
    │   ├── 24
    │   │   └──  - The Moon - Tallahassee, FL
    │   │       └── test
    │   └── 25
    │       └──  - The Moon - Tallahassee, FL
    │           └── test
    └── 03
        └── 01
            └──  - The Tes - Null, FL
                └── test2
于 2013-09-07T14:50:14.440 に答える
0

like this?

kent$  awk '{gsub(/-/,"/",$1);sub(/^[^/]*\//,"/",$NF);print $1$NF}' file
./1993/02/22/**files**
./1993/02/23/**files**
./1993/02/24/**files**
./1993/02/25/**files**
./1993/03/01/**files**
于 2013-09-06T22:44:44.790 に答える
0

これはsed+awk非常に多くのコメントの後です:

awk 'BEGIN{FS="-"}{print $1"/"$2"/"$3}' file | awk 'BEGIN{FS="**files**"}{print $1"/"FS}' | sed -e 's/ \//\//g'

./1993/02/22/**files**
./1993/02/23/**files**
./1993/02/24/**files**
./1993/02/25/**files**
./1993/03/01/**files**
于 2013-09-06T22:58:47.783 に答える