業務で覚えた知識を備忘録として記載していきます。
#利用シーン
- |(パイプ)を使って処理を繋げてみたい場合
- find -name
条件
| xargs mv で処理ができない場合
先日、あるファイルをディレクトリに移動させるshellを書くことがあったのですが該当ファイルを特定する方法としてFind -name"検索条件" で検索したファイルを|でつないでmvコマンドで移動させていました。
処理記述自体はあっていたのですが、いざ動かすタイミングで該当ディレクトリの配下に同様の条件に合致するファイルが複数存在することがわかりました。
#こんな感じの環境を想定
/home
└sample #処理対象
hogehoge.txt
hogehoge.csv
└targetdirectory
└dummydirectory #処理対象にしたくない
hogehoge.txt
hogehoge.csv
pwd
/home/
find -name "hoge*"
/sample/hogehoge.txt
/sample/hogehoge.csv
/sample/dummydirectory/hogehoge.txt
/sample/dummydirectory/hogehoge.csv
そのままの処理では、検索対象のファイルがすべて該当ディレクトリに移動してしまうため修正を余儀なくされました。
最初はFindのオプションか別のコマンドですぐに解決すると思ったのですが思いのほか該当する記事が見つからず困り果てたところ、人に聞いたりしてようやく解決することが出来ました。
今回は検索対象となるファイルがすべて同じディレクトリにある事前提で、同じような事で困っている人がいたときの為と自分の復習用に記事にしました。
#やりたいこと
- ある条件のファイルを移動(コピー、削除)したいが、Findコマンドではファイル特定ができない場合に処理する
#使用コマンド ls + awk + xargs + mv コマンドの複合
ls -l /検索先 | awk '{print$9}' | xargs -p mv 検索先{} 移動先
#解説(という体の確認)
※誤っている個所があればご指摘頂けると幸いです。
pwd
/home/sample/
ls -l #言わずと知れたファイルやディレクトリを表示するコマンド
#今回は -l オプションを使いlongフォーマットを表示させる
ls -l
drwxrwxrwx 1 user user 0 MM月 DD 10:00 targetdirectory
drwxrwxrwx 1 user user 0 MM月 DD 10:00 dummydirectory
-rwxrwxrwx 1 user user 0 MM月 DD 00:00 hogehoge.txt
-rwxrwxrwx 1 user user 0 MM月 DD 00:01 hogehoge.csv
awk {print$9} #longフォーマットの9つ目のカラムがファイル名の為$9を選択
ls -l | awk '{print$9}'
hogehoge.txt
hogehoge.csv
xargs -p #←の処理結果を引数として→の処理に渡せる便利なコマンド
#hogehoge.txtとhogehoge.csvを次のコマンドに引数として渡してくれる
#引数として使ってほしいところに{}を書く
mv #ファイル移動コマンド
#上記を複合させると
ls -l | awk '{print$9}' | xargs -p mv /home/sample/{} /home/sample/targetdirectory
echo $?
0
#結果確認
ls -l /home/sample
drwxrwxrwx 1 user user 0 MM月 DD 10:00 targetdirectory
drwxrwxrwx 1 user user 0 MM月 DD 10:00 dummydirectory
ls -l /home/sample/targetdirectory
-rwxrwxrwx 1 user user 0 MM月 DD 00:00 hogehoge.txt
-rwxrwxrwx 1 user user 0 MM月 DD 00:01 hogehoge.csv
ls -l /home/sample/dummydirectory
-rwxrwxrwx 1 user user 0 MM月 DD 00:00 hogehoge.txt
-rwxrwxrwx 1 user user 0 MM月 DD 00:01 hogehoge.csv
やったね。