2013-03-29 36 views
0

我知道這是一個愚蠢的問題,並且甚至可能不會給awk的本身(更像殼),但讓我解釋什麼,我需要相關: 我想(是的,這個代碼是錯誤的,但我希望你得到一個想法)使用 - 包括印刷結果至同一輸入

mv [awk 'BEGIN{for (i = 1; i <= 3; i++) { printf("file%d.png ", i) }}'] ../ 

,如果我進入

mv file1.png file2.png file3.png ../ 

基本上被解釋,像什麼

星號210

確實。

預先感謝您。

+0

縮寫:不,你不能用awk安全地做到這一點。你的真正目標是什麼?你爲什麼要使用awk呢? –

+0

你並不需要爲這個AWK:'MV文件{1..3} png格式../' –

+0

其實我是想多張圖像在一個非常特殊的順序使用ImageMagick的工具「蒙太奇」組合。我原來的帖子只是一個簡單的例子。 – Narwhal

回答

1

這樣做不安全很簡單:

mv $(awk 'BEGIN{for (i = 1; i <= 3; i++) { printf("file%d.png ", i) }}') ../ 

然而,這是非常危險和不安全。 awk的輸出是字符串分割和全局擴展;它不是指用空格文件名,如果它指的是一個名爲*文件,這將在當前目錄中的所有文件的列表外殼進行更換;其他的glob表達式也是相同的。不要這樣做。


使用awk這樣做安全是很難沒有慶典的線纏繞,同時,很大的數字,因爲這樣做安全需要生成文件的NUL分隔的列表(AWK可以做),閱讀該列表將awk列入shell數組,然後將其擴展到參數列表中。

#!/bin/bash 
# ^^ arrays are bash features, so a script starting with #!/bin/sh will not work 
# even if /bin/sh is a symlink to /bin/bash, #!/bin/sh will disable some 
# bash-only extensions. 
awk_files=() 
while IFS='' read -r -d '' file; do 
    awk_files+=("$file") 
done < <(awk 'BEGIN{for (i = 1; i <= 3; i++) { printf("file%d.png\0", i) }}') 
mv "${awk_files[@]}" ../ 

列表需要被NUL分隔因爲Vim是不能在一個文本文件名合法存在的唯一字;換行符,水珠字符,以及其他一切有效(/不正確的文件名內有效,但作爲路徑分隔符,這是一個完全合格的路徑內完全有效) - 和外殼沒有工具展開該沒有涉及多行代碼的列表。

這就是說,你並不需要在awk在所有的你的例子:

mv file{1..3}.png ../ 

...或者,模仿你的awk腳本的邏輯在本地的bash:

files=() 
for ((i=1; i<=3; i++)); do 
    files+=("file${i}.png") 
done 
mv "${files[@]}" ../ 
+0

我已經想通了。你已經指出了我正確的方向(無需使用awk),所以非常感謝! – Narwhal