Linux

如何創建多個目錄並用文件填充它們

  • September 28, 2022

我想製作一些目錄樹,並用帶有隨機內容的文本文件填充樹的每一端。

這是我到目前為止所嘗試的:

#!/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,並將標準輸出fooxargs. 在某些時候,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 字節的隨機數據,將其轉換為 的命令行參數echoxargs然後將嘗試輸出該數據(這不太可能順利,因為它是二進制數據並且我們正在談論這裡有一個命令行)。

最後,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 將相同的標準輸出再次轉換回命令行參數,這顯然是低效的。

引用自:https://unix.stackexchange.com/questions/719024