mkdir -p
จะสร้างไดเรกทอรี มันจะสร้างไดเรกทอรีหลักตามต้องการ
คำสั่งที่คล้ายกันมีอยู่สำหรับไฟล์ที่จะสร้างไฟล์และไดเร็กทอรีหลักตามต้องการหรือไม่?
mkdir -p
จะสร้างไดเรกทอรี มันจะสร้างไดเรกทอรีหลักตามต้องการ
คำสั่งที่คล้ายกันมีอยู่สำหรับไฟล์ที่จะสร้างไฟล์และไดเร็กทอรีหลักตามต้องการหรือไม่?
คำตอบ:
/dev/null
การติดตั้งจะทำเช่นนี้หากได้รับแฟ้มแหล่งที่มา -D
โต้แย้งว่าการสร้างไดเรกทอรีทั้งหมดแม่:
anthony@Zia:~$ install -D /dev/null /tmp/a/b/c
anthony@Zia:~$ ls -l /tmp/a/b/c
-rwxr-xr-x 1 anthony anthony 0 Jan 30 10:31 /tmp/a/b/c
ไม่แน่ใจว่าเป็นข้อผิดพลาดหรือไม่พฤติกรรมของไฟล์อุปกรณ์นั้นไม่ได้กล่าวถึงใน manpage คุณสามารถให้ไฟล์เปล่า (เช่นสร้างใหม่ด้วยmktemp
) เป็นแหล่งที่มา
ไม่มันไม่เท่าที่ฉันรู้ แต่คุณสามารถใช้mkdir -p
และtouch
กันได้ตลอดเวลา:
f="/a/b/c.txt"
mkdir -p -- "${f%/*}" && touch -- "$f"
ฉันพบกับสถานการณ์แบบนี้บ่อยครั้งดังนั้นฉันจึงเขียนฟังก์ชันลงใน.bashrc
ไฟล์ของฉัน ดูเหมือนว่านี้
function create() {
arg=$1
num_of_dirs=$(grep -o "/" <<< $arg | wc -l)
make_dirs=$(echo $arg | cut -d / -f1-$num_of_dirs)
mkdir -p $make_dirs && touch $arg
}
ดังนั้นเมื่อฉันต้องการสร้างไฟล์ภายในเส้นทางของไดเรกทอรีที่ไม่มีอยู่ฉันจะพูด
create what/is/it # will create dirs 'what' and 'is', with file 'it' inside 'is'
touchp
แล้วเหมือนกันmkdir -p
ฉันจะแนะนำเพราะมันเก็บไว้ในหนึ่งบรรทัด แต่การตั้งค่าตัวแปรแยกต่างหากช่วยให้คุณสามารถเปลี่ยนมันและรันคำสั่งจากประวัติอีกครั้งได้อย่างง่ายดาย
B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"
เป็นไปได้ที่จะ "ปลอมมัน"
ร็อบ Griffiths โพสต์บทความในปี 2007 ได้รับสิทธิได้อย่างง่ายดายสร้างจำนวนมากโฟลเดอร์ใหม่ใน Macworld.com นั้นเขากล่าวถึงการใช้คำสั่งในการอ่านในรายชื่อของไฟล์ที่จะสร้างไดเรกทอรีใช้xargs
mkdir
xargs
ความสามารถในการอ้างอิงplaceholder
( {}
) กับธงซึ่งมีค่าสำหรับแต่ละอาร์กิวเมนต์ส่งผ่านไปยัง-I
xargs
นี่คือความแตกต่างระหว่างกับธงนั้นและไม่มี:
$ foo.txt bar.txt | xargs echo
$ => foo.txt bar.txt
$ foo.txt bar.txt | xargs -I {} echo {}
$ => foo.txt
$ => bar.txt
xargs
ยังสามารถรันคำสั่งเชลล์โดยพลการด้วยsh -c
แฟล็ก:
foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'
เราสามารถรวมแนวคิดเหล่านี้เข้ากับmkdir -p
แทนที่จะเป็นmkdir
และแนวคิดในคำตอบของ@ldxเพื่อสร้างสิ่งนี้:
$ cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'
คำสั่งนี้จะแมปชื่อไฟล์แต่ละรายการในรายการไฟล์ที่คั่นด้วยบรรทัดแยกส่วนไฟล์ออกสร้างไดเรกทอรีด้วยmkdir -p
แล้วtouch
เปลี่ยนชื่อไฟล์ในไดเรกทอรีนั้น ๆ
พูดถึงตัวอย่างของฉันfiles.txt
เช่นนี้:
deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
cat files.txt
ผลิต deeply/nested/foo/bar.js
deeply/nested/baz/fiz.txt
deeply/nested/foo/bar.js
deeply/nested/baz/fiz.txt
ถูกส่งไปยัง xargs
-I {}
, xargs
จะแปลแต่ละโต้แย้งคำสั่งของตัวเองดังนั้นตอนนี้เรามี:
deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
&&
combinator เพื่อจัดกลุ่มคำสั่ง 3 ที่รันตามลำดับ - คำสั่งแรกเก็บไฟล์ไว้ในตัวแปรสภาพแวดล้อม (ที่ถูกใช้ซ้ำในไฟล์พาสถัดไป) โดยใช้ตัวแทนที่เราลงทะเบียนไว้ก่อนดังนั้นตอนนี้ มี:
f=deeply/nested/foo/bar.txt
f=deeply/nested/baz/fiz.txt
mkdir -p
ได้ แต่เราจำเป็นต้องตัดชื่อไฟล์ออก ง่ายพอที่จะใช้'${f%/*}'
:
mkdir -p deeply/nested/foo/
mkdir -p deeply/nested/baz/
f
ตัวแปรทั้งหมดอีกครั้งเมื่อเราtouch
:
touch deeply/nested/foo/bar.txt
touch deeply/nested/baz/fiz.txt
cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'
ซึ่งมี UUOC แล้วคุณจะย่อยเป็น xargs ที่ subshells กลับเข้าไปในเปลือกเมื่อwhile read
วงทำให้รู้สึกมากขึ้น
while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt
คำตอบทั้งหมดของคุณอาจจะเขียนได้ดีขึ้นเป็น ความจริงที่ว่าคุณไม่สามารถค้นหา UUOC ทางอินเทอร์เน็ตเป็นเวลา 10 วินาทีได้ก็เป็นเช่นนั้น