[英]Bash: How to tail then copy multiple files (eg using xargs)?
我一直在嘗試xargs和管道的各種組合,但是我無法獲得正確的結果。 先前的問題並不能完全涵蓋我想做的事情:
我發現我需要將find的結果傳遞到xargs中,然后可以在每個find結果上運行命令。 但是,我努力掙扎然后復制。 如果我將tail傳送到cp中,則cp似乎沒有收到文件(缺少文件操作數)。 這是到目前為止我嘗試過的一些示例:
find /foo/source -name "*.csv" | xargs -I '{}' sh -c 'tail -n +232 | cp -t /foo/dest'
cp:缺少文件操作數
find /foo/source -name "*.csv" | xargs -I '{}' sh -c 'tail -n +232 {} | cp -t /foo/dest'
結果:
cp:無法訪問'/ foo / dest':沒有這樣的文件或目錄...
find /foo/source -name "*.csv" | xargs -I '{}' sh -c 'tail -n +232 {} > /foo/dest/{}'
sh:/foo/dest/foo/source/0001.csv:沒有這樣的文件或目錄...
任何指針將不勝感激!
謝謝
只需在exec
使用find
並將文件名復制到變量中即可:
find your_dir -name "*.csv" -exec sh -c 'f="$1"; tail -n +5 "$f" > dest_dir/$(basename "$f")' -- {} \;
請參閱f={}
使$f
包含文件名以及完整路徑。 然后,只需將tail
的輸出重定向到文件中,從中刪除路徑即可。
或者,基於下面的評論中Random832的建議 (謝謝!):
find your_dir -name "*.csv" -exec sh -c 'tail -n +5 "$1" > dest_dir/$(basename "$1")' -- {} \;
您的最后一條命令是close,但是問題是{}
被完整的路徑名代替,而不僅僅是文件名。 使用basename
命令從中提取文件名。
find /foo/source -name "*.csv" | xargs -I '{}' sh -c 'tail -n +232 {} > /foo/dest/$(basename {})'
作為find和xargs的替代方法,可以使用for循環,而對於tail的替代方法則可以使用sed,請考慮以下事項:
source=/foo/source
dest=/foo/dest
for csv in $source/*.csv; do sed '232,$ !d' $csv > $dest/$(basename $csv); done
使用GNU Parallel,您可以:
find /foo/source -name "*.csv" | parallel tail -n +232 {} '>' /foo/dest/{/}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.