Linux
如何創建多個目錄並用文件填充它們
我想製作一些目錄樹,並用帶有隨機內容的文本文件填充樹的每一端。
這是我到目前為止所嘗試的:
#!/bin/bash set -e echo "Generating test folders" mkdir -p ./parent_{0..9}/child_{0..9} head -c 100 /dev/urandom | xargs echo >> ./parent_{0..9}/child_{0..9}/test.txt echo "done"
執行時,我收到此錯誤:
./gen-test.sh: line 8: ./parent_{0..9}/child_{0..9}/test.txt: ambiguous redirect
我做錯了什麼,什麼是更聰明的方法來完成這項任務?
您做錯的事情不起作用的原因是因為重定向和文件名生成是由 shell 處理的,而不是由 xargs 處理的。
當你寫
foo > foo.out
然後 shell 將為
foo
您執行,擷取其標準輸出,並將其寫入foo.out
.如果你跑
foo | xargs bar > bar.out
然後 shell 將為
foo
您執行,擷取其標準輸出,執行xargs
,並將標準輸出foo
從xargs
. 在某些時候,xargs
將執行bar
,並將它在標準輸入上接收到的數據作為參數傳遞給它,並且它會以一種導致 的標準輸出bar
與 的標準輸出無法區分的方式這樣做xargs
。shell 將擷取該標準輸出,並將其寫入bar.out
.您的論點
./parent_{0..9}/child_{0..9}/test.txt
也由 shell 解釋。它刪除該參數,並將其替換為該模式將生成的文件名,以便mkdir
命令行變為類似(...
為簡潔起見添加):mkdir -p ./parent_0/child_0/test.txt ./parent_0/child_1/test.txt ./parent_0/child_2/test.txt ... ./parent_1/child_0/test.txt ... ./parent_9/child_9/test.txt
稍後,您執行
head -c 100 /dev/urandom | xargs # ...
這意味著您讀取 100 字節的隨機數據,將其轉換為 的命令行參數
echo
,xargs
然後將嘗試輸出該數據(這不太可能順利,因為它是二進制數據並且我們正在談論這裡有一個命令行)。最後,shell 看到
>>
,它將其解釋為附加重定向,後跟相同的模式;所以這意味著重定向變成>> /parent_0/child_0/test.txt /parent_0/child_1/test.txt # and so on
但你不能那樣做;您一次只能重定向到一個文件(這是您看到的“模糊重定向”錯誤)。
最簡單的解決方法是遍歷文件:
for file in /pattern_0/child_0/test.txt; do head -c 100 /dev/urandom > $file done
因為任何使用 xargs 的解決方案都需要 echo 將命令行參數轉換為標準輸出,而只能使用 xargs 將相同的標準輸出再次轉換回命令行參數,這顯然是低效的。