電子書籍の厳選無料作品が豊富!

現在仕事でPerlのプログラムを使用しています。(これは今はいらっしゃらない上司に作ってもらいました)
使用しているのはLinuxでOSは「Fedora」です。
それで以下のようなツリー構成のデータをディレクトリに分けたいんです。

ディレクトリ『A』の中に「***A_1.bz2」「***A_2.bz2」「***A_3.bz2」「***A_4.bz2」
ディレクトリ『B』の中に「***B_1.bz2」「***B_2.bz2」「***B_3.bz2」「***B_4.bz2」
こういったディレクトリが『A』~『L』まであるとします。
これを拡張子前の「1」~「4」の数字別にディレクトリを作って下のように分配していきたいんです。
●『1』のディレクトリ内ー「***A_1.bz2」・「***B_1.bz2」~「***L_1.bz2」
 『2』のディレクトリ内ー「***A_2.bz2」・「***B_2.bz2」~「***L_2.bz2」
 『3』のディレクトリ内ー「***A_3.bz2」・「***B_3.bz2」~「***L_3.bz2」
 『4』のディレクトリ内ー「***A_4.bz2」・「***B_4.bz2」~「***L_4.bz2」

こういったことをやるために以下のようなプログラムを使用しています。
--------------------------------------------------------------------------
$path0="/home/***********/****/**";

# output directory
system( "mkdir $path0/1" );
system( "mkdir $path0/2" );
system( "mkdir $path0/3" );
system( "mkdir $path0/4" );

opendir( DIR, $path0);
@dlist = readdir( DIR );
closedir( DIR );

foreach $dname ( @dlist ){
if( $dname=~/B/ ){
$path1=$path0.'/'.$dname;
# print( "$path1\n" );
chdir( $path1 );

# unzip bz
system( "bzip2 -d *bz2" );

opendir( DIR, $path1);
@flist = readdir( DIR );
closedir( DIR );

foreach $fname ( @flist ){
print( "$fname\n" );
if ( $fname=~/*1/){ $exec="mv $fname $path0/1/"; }
elsif( $fname=~/*2/){ $exec="mv $fname $path0/2/"; }
elsif( $fname=~/*3/){ $exec="mv $fname $path0/3/"; }
elsif( $fname=~/*4/){ $exec="mv $fname $path0/4/"; }
system( "$exec" );
}
}
}
--------------------------------------------------------------------------------
※ ( $fname=~/*1/)  の辺りはちょっと適当です。

このプログラムですと、分配まではできるのですが元々あり空になってしまった『A』~『L』のディレクトリが残ってしまいます。
この空のディレクトリを削除するにはどういったプログラムを追加したらいいでしょうか?
すみませんが、どなたかよろしくお願いします。

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

  • 「tatsumaru77様」回答ありがとうございます。
    実はこのディレクトリには仮で「A」~「L」としましたが、実はすべてのディレクトリ名の頭に「B」がついているのです。
    それで今回の仮のディレクトリ名とごちゃごちゃになってしまいました。
    ですので分かりやすく書くと「B0A」「B0B」「B0C」・・・「B0L」といった感じです。

      補足日時:2024/07/03 17:12

A 回答 (3件)

「B0A」「B0B」「B0C」・・・「B0L」下には、ファイルが存在しないという前提になりますが、(ファイル移動が完了している前提)


最後に、以下の2行を追加してください。

$exec = "rmdir $path0/B*";
system( $exec );

path0の下のBで始まるディレクトリを全て削除します。
    • good
    • 0
この回答へのお礼

さらに回答ありがとうございました。
教えていただいた2行を追加でうまくいきました。

お礼日時:2024/07/04 11:17

「空のディレクトリを削除する」だけなら, 素直に rmdir すればいいと思うんだ... けど, これいつの時代の Perl なんだろ....



ついでにいえば mkdir や mv をなんで system 経由で実行しているんだろうかとか, パスの作り方にしても
system( "mkdir $path0/1" );

$path1=$path0.'/'.$dname;
とが混在しているのが気になる.
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2024/07/04 11:17

補足要求です。



$path0="/home/***********/****/**";
のディレクトリ下に
A
B
C
・・途中省略・・
L
のディレクトリがあるのでしょうか?
そうだとすると、
foreach $dname ( @dlist ){
if( $dname=~/B/ ){・・・・①

①の行でif が成立するのはBのディレクトリだけです。
A,C,D,E,F,G,H,I,J,K,Lのディレクトリの中のファイルは処理されませんが、
それは、想定した動作なのでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
一応捕捉にも書きましたが、今回のディレクトリ名は仮の名前にしていました。
ごちゃごちゃになってしまい大変申し訳ありませんでした。

お礼日時:2024/07/03 17:13

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A