LoginSignup
3
2

More than 3 years have passed since last update.

ls + awk + xargs + mvの複合コマンド

Last updated at Posted at 2021-02-07

業務で覚えた知識を備忘録として記載していきます。

利用シーン

  • |(パイプ)を使って処理を繋げてみたい場合
  • 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

やったね。

3
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2