てきとうなメモ

本の感想とか技術メモとか

xargs -I

xargsって標準入力の最後に引数を渡すだけだと思っていたが、テンプレート的に渡してcpとかmvとかlnとかに渡すことができるのか

ls /etc/*.conf | xargs -I % cp % /path/to/destdir

-Iで指定した文字列(%)が標準入力のものに置き換わる。これは一件ずつ実行されるらしい

$ ls /etc/*.conf | xargs -I % echo %
/etc/adduser.conf
/etc/blkid.conf
/etc/ca-certificates.conf
/etc/colord.conf
/etc/ddclient.conf
/etc/debconf.conf

MacOSXだと-Jオプションで標準入力から複数行読み取ることができる

$ ls /etc/*.conf | xargs -J % echo %
/etc/asl.conf /etc/autofs.conf /etc/dnsextd.conf /etc/ftpd.conf /etc/ip6addrctl.conf /etc/kern_loader.conf /etc/man.conf /etc/newsyslog.conf /etc/nfs.conf /etc/notify.conf /etc/ntp-restrict.conf /etc/ntp.conf /etc/ntp_opendirectory.conf /etc/pf.conf /etc/resolv.conf@ /etc/rtadvd.conf /etc/syslog.conf

-Iオプションの場合、置換文字列はコマンドライン上に複数回書けるので、以下のように別名にコピーとかもできる。

$ ls /etc/*.conf | xargs -I % cp % %.old