這樣做不安全很簡單:
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[@]}" ../
縮寫:不,你不能用awk安全地做到這一點。你的真正目標是什麼?你爲什麼要使用awk呢? –
你並不需要爲這個AWK:'MV文件{1..3} png格式../' –
其實我是想多張圖像在一個非常特殊的順序使用ImageMagick的工具「蒙太奇」組合。我原來的帖子只是一個簡單的例子。 – Narwhal