アプリ版:「スタンプのみでお礼する」機能のリリースについて

あるフォルダの中にサブフォルダがあって、その下にファイルがあります。

その中間のサブフォルダだけを消したいのですが、どうしたらよいでしょうか。

ちなみにフォルダの中にはサブフォルダは一つだけで、そういうフォルダがだいたい1000個弱あります。

質問者からの補足コメント

  • dir0/subdir0/file0
    dir0/subdir0/file1

    dir1/subdir1/file2
    dir1/subdir1/file3





    dir0/file0
    dir0/file1

    dir1/file2
    dir1/file3



    としたいのです。

    dir0とdir1のようなフォルダが1000個弱あります。

    上の例だと、file0からfile3をdir0とdir1の直下に移動し、rmdirでsubdir0とsubdir1を削除…になるのでしょうか。

    たぶん、for文で回すことになるのかなと思いつつ…

    私は普段、プログラミングやシェルはしていないので、ここからどうしたら良いのか分からなくなってしまいました。

    よろしくお願い致します。

      補足日時:2015/03/15 18:09

A 回答 (3件)

dir0とかがあるディレクトリをカレントディレクトリとして、次のコマンド(長いですが1行です)で行けるんじゃないでしょうか。

dir0配下にディレクトリは必ず一つという前提です。

$ ls -F1 | grep '/$' | while read D ; do A=`ls -F1 ${D} | grep '/$'` ; find ${D}${A} -type f | while read F ; do mv ${F} ${D} ; done ; rmdir ${D}${A} ; done

敢えてシェルスクリプトにするなら、次のような感じ。

#!/bin/bash

ls -F1 | grep '/$' | while read D ; do
A=`ls -F1 ${D} | grep '/$'`
find ${D}${A} -type f | while read F ; do
mv ${F} ${D}
done
rmdir ${D}${A}
done

「ls -F」は、ファイルの種類によって末尾に記号がつく、ディレクトリなら「/」がつきます。
「ls -1」は、1行に1ファイルのみ出力です。
「while read D」は、1行をシェル変数「D」に代入してdo~doneの処理を繰り返すという意味です。
「A=`~~~`」は、~~~の出力結果をシェル変数「A」に代入するという意味。

若干ダサいですが、お望みのことはできるのではないかと思います。
    • good
    • 0

こんな感じで良いですか。


データlostの責任もてませんのでbackupとってやってください。

bash3.2$ find .
.
./dir0
./dir0/subdir0
./dir0/subdir0/file0
./dir0/subdir0/file1
./dir1
./dir1/subdir1
./dir1/subdir1/file2
./dir1/subdir1/file3
bash3.2$
bash3.2$ for i in dir*
do
(cd $i ; mv subdir*/* . ; rmdir subdir*)
done
bash3.2$ find .
.
./dir0
./dir0/file0
./dir0/file1
./dir1
./dir1/file2
./dir1/file3
bash3.2$
    • good
    • 0

ちょっとやりたいことがよくわからないのですが。




dir0/subdir0/file0
dir0/subdir0/file1
....
dir0/subdir0/file999
※ dir0ディレクトリの下にsubdir0ディレクトリだけ

という構造になっているということでしょうか。

「間のサブフォルダだけを消したい」というのは、
dir0/subdir0/file0 → dir0/file0
としたい、ということでしょうか?

それなら
ファイルをディレクトリへ移動→(必要なら)サブディレクトリの削除
でよいかと。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!