2016-12-08 157 views
3

我正在嘗試編寫一個腳本,該腳本使用find和xargs將大文件夾中的舊文件存檔。這是該行:xargs sh -c跳過第一個參數

find /tmp/messages/ -mtime +9 -print0 | xargs -x -t -0 -n 1000 sh -c 'tar rPf /tmp/backup.tar "[email protected]" && rm -f "[email protected]"; sleep 1 && echo Finished one loop: $(date +"%T")' 

劇本大多是工作,但它每個命令爲1000個文件運行時將跳過第一個文件,我似乎無法找出原因。

下面是另一個例子(我試過玩弄簡單的命令來看看會發生什麼:

如果我只用回聲和xargs的,我可以運行有效的一個命令:

$ echo a b c d e f| xargs -n 2 echo "[email protected]" 
a b 
c d 
e f 
$ echo a b c d e f| xargs -n 3 echo "[email protected]" 
a b c 
d e f 

另反之,如果我想我每次打印每組時間睡覺,我添加SH -c添加一串命令:

$ echo a b c d e f| xargs -n 2 sh -c 'echo "[email protected]"; sleep 1;' 
b 
d 
f 
$ echo a b c d e f| xargs -n 3 sh -c 'echo "[email protected]"; sleep 1;' 
b c 
e f 

見的第一個項目是如何跳過

關於可能會發生什麼的任何想法?

在此先感謝!如果您需要任何額外的信息,請告訴我,我很樂意提供。

+1

看看'-c'選項,https://linux.die.net/man/1/bash – Inian

回答

3

sh -cbash -c第一個參數是腳本即$0當您使用[email protected]其上未印刷的名稱:

實例:

echo a b c d e f| xargs -n 3 bash -c 'echo "$0 [email protected]"' 
a b c 
d e f 

要解決這個問題可以傳遞_作爲虛擬名的腳本,然後它應該工作:

echo a b c d e f| xargs -n 3 bash -c 'echo "[email protected]"' _ 
a b c 
d e f 

這將工作正常VEN與sleep例如:

echo a b c d e f| xargs -n 3 bash -c 'echo "[email protected]"; sleep 1' _ 
a b c 
d e f 
+1

是的,這似乎是做的伎倆,感謝您的幫助! –

1

在shell命令行語言的@special parameter

擴展爲位置參數,從1開始。

sh命令被調用爲以下形式:

sh -c[OPTIONS] command_string [command_name [argument...]] 

從已-c選項的文檔:

讀取來自command_string操作數的命令。從剩餘的參數操作數中依次從command_name操作數的值和位置參數($1,$2等)中依次設置特殊參數0的值(請參見特殊參數)。

例如,在下面的命令:

sh -c 'tar czvf arch.tar.gz [email protected]' a b c 
  • command_string'tar czvf arch.tar.gz [email protected]'
  • command_namea
  • 第一argumentb
  • 第二argumentc

因此,命令串內$0將擴大到a$1b$2c,並且[email protected]特殊參數將擴大到b c

因此,如果您要在命令字符串中使用command_name,請參閱特殊參數零,即$0