2014-01-15 68 views
1

在bash命令行中,我必須找到名稱與我的系統中某個特定模式相匹配的所有zip文件,然後將它們解壓縮到我的目錄中。xargs oneliner解壓縮文件

我想組織子文件夾中的解壓縮文件,我想選擇我的子文件夾名稱與基於原始zip文件名稱(不使用完整路徑)的自定義命名約定。

我知道週期的工作,無論如何,因爲我現在正在學習xargs,我想知道我是否可以在xargs oneliner中做同樣的事情;類似於:

locate -r "<zipped files regex>" | xargs -i -t "foldername=$(echo {} | sed 's/.*\///'); mkdir -p $folderName; unzip {} -d $folderName" 

我得到這個消息:

foldername={}; mkdir -p ; unzip {} -d 
xargs: foldername={}; mkdir -p ; unzip {} -d : No such file or directory 

你能幫我做工作?

謝謝!

+0

當前命令的問題究竟是什麼?另外,您是否可以提供一個來自{}>的

+1

Xargs將所有內容傳遞給一個zip命令,zip一次只能處理一個zip文件,因此您應該使用for-loop或'find ... -exec'。 –

+0

@SamiLaine好點,但'xargs'有'-n'('--max-args')選項。儘管如此,使用帶'-exec'的'find'更直接。 –

回答

2

$()之內的echo {} | sed 's/.*\///'在xargs之前和之前的任何其他位置之前被執行並且在定位之前。所以用xargs很難做到這一點。不使用xargs的一種方式:

locate -r [.]zip$ | \ 
    sed 's!.*/\([^/]*\)$!mkdir -p "\1"; unzip -n -d "\1" "&";!' | \ 
    sh 2> ERRORS 
+0

我不知道sed的這種用法,絕對聰明的解決方案!謝謝! –

+0

這有效地使'sed'成爲一個更智能,更強大的'xargs' – CygnusX1

0

使用GNU並行以提高可讀性,並可能加速比:

locate -r [.]zip$ | parallel "mkdir -p {/.}; cd {/.} && unzip {}" 

手錶簡要介紹介紹視頻: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

穿行教程( man parallel_tutorial)。你命令行 愛你。