空白を含むディレクトリ名のあるループ処理
ディレクトリごとに圧縮してバックアップする処理を作っているのですが、
空白を含むディレクトリがあるとうまくいかないので困っています。
以下のようなスクリプトを作ってみました。
#!/bin/bash
for dirname in `ls -1 /data`
do
zip -r $dirname.zip /data/$dirname/
done
ディレクトリ構造は以下のとおりです。
/data
/data/data1
/data/data2
/data/data3
この状態だと問題ありませんが、
これに次のようなディレクトリがあると、
/data/data1 copy
ディレクトリ「data1 copy」としてうまく処理してくれず、
次のようなエラーになります。
zip warning: name not matched: /data/copy/
ディレクトリ「/data/copy/」がないと言う事だと思うのですが、
その前に「data1」の処理が2回行われたメッセージが出ていました。
zip コマンドを echo $dirname に変更して実行すると、
data1
data1
copy
data2
data3
と表示されたので、
「data1 copy」が「data1」と「copy」に分断されて処理されているようです。
「data1 copy」を「data1 copy.zip」として圧縮するにはどのようにしたらいいでしょうか。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
#2です。
訂正と補足。find /data -mindepth 1 -maxdepth 1 -type d | xargs -i zip -r "`basename {}`".zip {}
と、basenameのところを" "で囲まないといけませんでした。
#1のお礼中で、xargsを使っていたのでそれに習いましたが、xargs -i を使わず、これでもいいです。
find /data -mindepth 1 -maxdepth 1 -type d -exec zip -r "`basename {}`".zip {} \;
また、#3の方が書いているように、空白文字(空白、タブ、改行)を含んだファイル名をfind+xargsで扱うときには、一般的には、ファイル名をヌル文字区切りにする
>find ... -print0 |xargs -0 ...
を使います。今回は、xargs で -i オプションを使っているので、たまたま必要ないだけです。
なお、IFSを空に設定しなくても、
>連続する複数ある区切り文字が1文字として処理されてしまいます
ということはないのですが、ファイル名が空白文字で始まったり終わったりしていると、IFSを空にしないでread dirnameだと、それら空白文字が落ちてしまいます。
ls を使う必然性がないなら、#4の方の回答のように、単にforにワイルドカードを書くだけの方が簡単です。
No.4
- 回答日時:
アスタを使えばスペースは展開されませんし、
さらにシェル変数をダブルクォートで括ることで展開を防げます。
#!/bin/bash
for dirname in /data/*
do
test -d "$dirname" || continue
zip -r "$dirname".zip /data/"$dirname"/
done
あと、while read ... を使う場合は IFS を設定した上で while read -r ...
としなければ連続する複数ある区切り文字が1文字として処理されてしまいます。
なので、手間と簡潔さを考えると上記のようにするのがよいと思います。
No.3
- 回答日時:
find を使うなら
find ... -print0 |xargs -0 ...
の方が安全でしょう.
ご回答いただきありがとうございます。
find の -print0 と xargs の -0 について調べてみました。
ヌル文字で区切る事によって、間違いが起きないようにするため、と解釈しました。
find の際には、付けるようにします。
No.2
- 回答日時:
元の形を生かすなら、
ls -1 /data | while read dirname
do
zip -r "$dirname".zip /data/"$dirname"/
done
>find でその階層しか検索しないようにする方法があれば教えてください。
findを使うなら、
find /data -mindepth 1 -maxdepth 1 -type d | xargs -i zip -r `basename {}`.zip {}
ご回答いただきありがとうございます。
他にいただいた回答なども含めて、まだいろいろと試している最中です。
元の形でもなんとかできそうなのですね。
元の形は、よくわからないで私が作ったので、なんとも言えない形でした。
と言うのは、それぞれのサブディレクトリ名で圧縮されるのはよかったのですが、
できれば別のディレクトリに圧縮ファイルを作成したかったのです。
質問では書かなかったのですが、圧縮後に別のディレクトリに移動させるために、
mv で処理していました。
これが find と xargs なら、たぶん basename で /data のルートからのディレクトリ名を省き、
サブディレクトリ名だけにできて、別のディレクトリ名と合わせる事で、
直接そこへ圧縮ファイルを作成できるのではないかと思っています。
いろいろなやり方があるので、他にいただいた回答も試して、どうするか決めたいと思います。
No.1
- 回答日時:
古式ゆかしい方法だと
find + xargs
ご回答いただきありがとうございます。
find と xargs で次のようにするとうまくいけたような気がします。
find /data/* -type d | xargs -i zip -r {}.zip {}
find と xargs の使い方を調べて、なんとかこうしたのですが、
これで問題ないでしょうか。
今は、/data/data1 以下の階層にはディレクトリがないのでいいのですが、
例えば、階層が「/data/data1/sub1」などとあった場合には、
find でそのディレクトリが検索されてしまい、
/data/data1/sub1 の処理がされる上に、
/data/data1 の処理の中にも sub1 がされてしまいます。
find でその階層しか検索しないようにする方法があれば教えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- UNIX・Linux Linuxについて質問です。 以下のような設定をしたMakefileを作成するにはどう記述すればよい 1 2023/02/03 20:10
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- UNIX・Linux サーバー間のデータコピー(データ形式とデーターフォーマットの変換あり。一定間隔で処理) 2 2023/08/22 22:15
- Excel(エクセル) VBAのoffsetの動き方について教えてください 3 2022/11/25 23:36
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- PostgreSQL PostgreSQLで"pg_dumpall -f data.sql"を使ってバックアップしたデータ 2 2022/09/19 08:14
- その他(OS) アプリの起動に必要なファイルについて 1 2023/04/23 17:53
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル名で / (スラッシュ...
-
scpによるデータ転送後、ディレ...
-
7zを使うとフォルダの中身がす...
-
Minecraftにforgeを入れたら、...
-
logwatchからメールが来ない
-
DVDでAUDIO_TSが無い!?
-
ソースからビルドに失敗/bash/r...
-
LinuxでCD-RWをマウントする方...
-
ftpでのフォルダごとの転送はで...
-
tarコマンドのエラーについて
-
batファイルで、あるディレクト...
-
make時に出てきたエラーメッセ...
-
ftpのmgetコマンドの自分の格納...
-
FTPコマンドのCDについて
-
サーバー間のデータコピー(デ...
-
2TBのUSBメモリを2000円ほどで...
-
「照合パターンに合いません」...
-
#./configureの時点でダメです。
-
unzipコマンドでディレクトリな...
-
拡張子.dどういう意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
7zを使うとフォルダの中身がす...
-
拡張子.dどういう意味
-
ftpのmgetコマンドの自分の格納...
-
make時に出てきたエラーメッセ...
-
/(スラッシュ)で区切ったフル...
-
ホームページのディレクトリを...
-
「照合パターンに合いません」...
-
linuxコマンド mkdirでディレ...
-
バッチファルの置き場所
-
scpによるデータ転送後、ディレ...
-
「ドット(.)」と「¥」の意味...
-
FTPコマンドのCDについて
-
"cp -a"と"cp -r"の違い
-
Linuxコマンドについて
-
tarコマンドのエラーについて
-
シンボリックリンクについて
-
unzipコマンドでディレクトリな...
-
ファイル名で / (スラッシュ...
-
macで、cdで移動できない
-
FTPでPUTできない原因は何?
おすすめ情報