ปัญหาเกี่ยวกับคำสั่งติดตั้งเพื่อคัดลอกไดเรกทอรีทั้งหมด


16

ดังนั้นฉันจึงมี repo กับไฟล์ configบางตัวและฉันพยายามสร้าง a makefileเพื่อติดตั้งใน homedir ปัญหาที่ฉันมีคือเมื่อฉันเรียกใช้คำสั่งต่อไปนี้ในทุบตี

install -m 755 -d ~/path/to/dotfilesDir/ ~/

ดูเหมือนไม่มีอะไรเกิดขึ้นในขณะที่

install -m 755 ~/path/to/dotfilesDir/{file1,file2,...} ~/

ทำงานตามที่ตั้งใจไว้

ทำไมโซลูชันแรก (ง่ายกว่าและสะอาดกว่า) ไม่ทำงาน



ฉันเพิ่งใช้ cp กับ -r ฉันไม่เข้าใจจริงๆว่าทำไมติดตั้ง dont มีตัวเลือก -r เช่น cp ได้
บราฮิม

คำตอบ:


7

จากการดูที่หน้าคนดูเหมือนว่าinstallจะไม่ทำสิ่งที่คุณต้องการ

อันที่จริงส่วนเรื่องย่อบ่งชี้การใช้งานของแบบฟอร์ม:

install [OPTION]... -d DIRECTORY...

และในภายหลัง man page พูดว่า:

-d, - ไดเรกทอรี
ถือว่าอาร์กิวเมนต์ทั้งหมดเป็นชื่อไดเรกทอรี; สร้างส่วนประกอบทั้งหมดของไดเรกทอรีที่ระบุ

ดังนั้นจึงดูเหมือนว่าฉันที่จุดของตัวเลือกนี้คือเพื่อให้สามารถที่จะติดตั้งที่ซับซ้อน ( แต่ว่างเปล่า) mkdir -p ...โครงสร้างไดเรกทอรีàลา

คุณสามารถบรรลุสิ่งที่คุณต้องการด้วยการวนซ้ำ:

for file in /path/to/DotFiles/dir/*;do
    install -m 755 "$file" ~/
done

หรือหากมีหลายระดับภายใต้/path/to/DotFiles/dirคุณสามารถใช้find:

find /path/to/DotFiles/dir/ -type f -exec 'install -m 755 "{}" ~/' +

สร้างส่วนประกอบทั้งหมดของไดเรกทอรีที่ระบุ = สร้างส่วนย่อย แต่ไม่ใช่ไฟล์หรือไม่
nathdwek

@nathdwek ถูกต้อง วิธีนี้คุณสามารถสร้างโครงสร้างไดเรกทอรีที่ซับซ้อน (โครงกระดูก) ภายใต้ไดเรกทอรีบ้านของคุณโดยใช้install -m 755 -d ~/foo/bar/baz
Joseph R.

1
-exec 'install -m 755 "{}" ~/' +จะไม่ทำงานอย่างน้อยไม่ได้อยู่ในบางรุ่น (ทั้งหมด? มากที่สุด?) ของลินุกซ์ อาจทำงานกับ OSX หรืออะไรก็ได้ ใช้สิ่งนี้ค่อนข้างตรงไปตรงมาถ้าคุณต้องการ oneliner: 1. สร้างไดเรกทอรี recursive: for d in $(find . -type d); do install -d --mode 755 "$d" "../install-test/$d"; done2. สร้างไฟล์ recursive:for f in $(find . -type f); do install -D --mode 644 "$f" ../install-test/; done
Josh M.

6

เริ่มต้นจากคำตอบของ @Joseph R. นี่เป็นวิธีแก้ปัญหาของฉันที่จะทำให้มันทำงานกับการค้นหาได้เนื่องจากฉันไม่สามารถใช้คำสั่งของเขาได้ (ฉันไม่คิดว่าจะเป็นเพราะกฎที่ใช้กับ\+: ไม่มีอะไรหลังจาก{}องค์ประกอบ) (ฉันไม่สามารถแสดงความคิดเห็นย่อหน้าทั้งหมดนี้สามารถลบออกได้)

หากต้องการคัดลอกไฟล์ทั้งหมดลงในไดเรกทอรีเดียวกันที่แน่นอน (ที่นี่target/directory):

find directory/to/copy -type f -exec install -Dm 755 "{}" "target/directory" \;

-D ไม่ได้บังคับที่นี่มันจะสร้างไดเรกทอรีที่ไม่มีอยู่ให้เป้าหมาย

หากต้องการคัดลอกลำดับชั้นของไดเรกทอรีทั้งหมดและไฟล์ (ซึ่งจะไม่ใช้ไดเรกทอรีที่ว่างเปล่า) โดยเริ่มจากตำแหน่งที่คุณอยู่ในปัจจุบัน:

find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \;

ดังที่กล่าวมาสิ่งนี้จะสร้างต้นไม้ขึ้นมา$PWDใหม่ นอกจากนี้ถ้าคุณต้องการคัดลอกไดเรกทอรีที่ว่างเปล่าบนสามารถหาวิธีการใช้ที่-type dของและfindinstall -d

ดังนั้นในการคัดลอกทรีโดยเริ่มจากไดเร็กตอรี่ที่ไม่ใช่$PWD:

(cd parent/directory && find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \;)

สังเกตว่าparent/directoryจะไม่คัดลอกไป

พิเศษ

สำหรับผู้ที่ใช้shell/fishนี่คือบรรทัดที่ไม่เหมือนกัน:

fish -c 'cd parent/directory; and find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \\;'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.