[英]passing arguments to bash script using xargs
我運行以下bash命令來格式化帶有文件inode和哈希的日志:
time find BASE_DIR -maxdepth 1 -mindepth 1 -type d |
sort |
xargs -P100 -n1 -IFF bash -ce "find FF -type f" |
sort |
xargs -n1 -I {} bash -ce "
FILE=$1; INODE=`stat -c '%i' $FILE`;
HASH=`cat $FILE | md5sum | cut -d' ' -f1`;
printf 'Name: %s - Inode: 0x%X - MD5: %s\n' $FILE $INODE $HASH;" {}
但是,每次運行此命令,我都會得到以下信息:
Name: FILE1 - Inode: 0xFFFFFFFFFFFFFFFF> - MD5: SOME_MD5
Name: FILE1 - Inode: 0xFFFFFFFFFFFFFFFF> - MD5: SOME_MD5
Name: FILE1 - Inode: 0xFFFFFFFFFFFFFFFF> - MD5: SOME_MD5
Name: FILE1 - Inode: 0xFFFFFFFFFFFFFFFF> - MD5: SOME_MD5
每次相同的文件。 如何正確將args傳遞給bash?
編輯
通過將第二個xargs更改為:
xargs -n1 bash -ce '
path="$0";
inode=`stat -c "%i" $path`;
hash=`cat $path | md5sum | cut -d" " -f1`;
printf "Name: %s - InodeContext<0x%X> - MD5: %s\n" $path $inode $hash;'
立即出現的錯誤是傳遞給bash -c "...commands..."
的第一個參數以$0
結尾,而不是$1
結尾。 另外,由於您在"...commands..."
周圍使用了雙引號,因此調用腳本將在腳本傳遞到子shell時對所有變量進行插值。
不過,這似乎確實令人費解。 如果不知道您究竟希望完成什么,這是一種推測,但是我會采取類似的方法
time find BASE_DIR -maxdepth 1 -mindepth 1 -type d \
-execdir find . -type f -exec bash -c '
for f; do
inode=$(stat -c "%i" "$f")
md5=$(md5 <"$f" | cut -d " " -f1)
printf "Name: %s - Inode: 0x%X - MD5: %s\n" "$f" "$inode" "$md5"
done' _ {} \\+ \;
如果您可以解釋如何對輸出進行排序,則可以將排序鍵放在printf
,並在最后進行排序。
還要注意我們如何避免私有變量中的大寫字母。
我發現一次做一件事情並做好一件事情變得容易。
-I{}
選項表示-n1
。 我仍然習慣於使用-i
選項,該選項與-I{}
相同。
find BASE_DIR -maxdepth 1 -mindepth 1 -type d |
# what's the point in sorting before -P100?
xargs -P100 -i find {} -type f |
sort |
# run stat and md5sum for the same file
# output: <filename> <stat output> <md5sum>
xargs -n1 bash -ce '
printf "%s\n" "$1";
stat -c "%i" "$1";
md5sum "$1" | cut -d" " -f1;
' -- |
# for every three (filename, stat, md5sum) arguments run printf
xargs -n3 printf 'Name: %s - Inode: 0x%X - MD5: %s\n'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.