簡體   English   中英

Bash:如何拖尾然后復制多個文件(例如使用xargs)?

[英]Bash: How to tail then copy multiple files (eg using xargs)?

我一直在嘗試xargs和管道的各種組合,但是我無法獲得正確的結果。 先前的問題並不能完全涵蓋我想做的事情:

  • 我在某處有一個源目錄,可以說/ foo / source,其中包含不同的文件
  • 我只想將在源代碼中找到的csv文件復制到另一個目標,例如/ foo / dest
  • 但我同時也需要刪除232個標題行(例如,使用尾部)

我發現我需要將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM