はじめに
findでファイル名のみ表示とかを参考に、awk
とかsed
とかで頑張ってみようとしたけれど、よくよく考えたら-exec
オプションでシンプルに解決できたのでメモ。
-execオプションを使う
-exec
オプションにbasename
コマンドを組み合わせる。(速度については分かりません)
find . -type f -exec basename {} \;
応用編(おまけ)
抽出したファイルと同名のファイルが、別のディレクトリに存在するかを確認する。
find . -maxdepth 1 -type f -exec basename {} \; | xargs -n 1 find /hoge -maxdepth 1 -name
こんなのと合わせて、ワイルドカード指定でコピーするときの、同名ファイルの存在確認なんかに使えそう。
# !/bin/bash
function FindCopy () {
SRC_DIR=`dirname "$1"`; FILE_PATTERN=`basename "$1"`; DEST_DIR="$2"
FINDCMD="find $SRC_DIR -maxdepth 1 -name $FILE_PATTERN"
RES=`$FINDCMD -exec basename {} \;` || return 2 # エラー終了
[ -z "$RES" ] && { echo "src files not found."; return 0; } # コピー元ファイルなし⇒スキップして正常終了
RES=`echo "$RES" | xargs -n 1 find $DEST_DIR -maxdepth 1 -name` || return 2 # エラー終了
[ -n "$RES" ] && { echo "dest files already exist."; return 1; } # コピー先ファイル競合⇒エラー終了
$FINDCMD -exec cp -p {} $DEST_DIR \; || return 2 # エラー終了
return 0 # 正常終了
}
# 使用例
FindCopy "/hoge/*.text" "/huga"