با برنامه cpio :
cd "$srcdir" && find . -type d -print | cpio -pdumv "$dstdir"
یا با برنامه pax:
cd "$srcdir" && find . -type d -print | pax -rwdv "$dstdir"
یا با globbing خاص پوسته zsh:
zsh -ec ' cd -- "$srcdir" dirs=(**/*(ND)) cd -- "$dstdir" mkdir -p -- $dirs'
یا با tar گنو، وترکیب دستوری بلندتر:
cd "$srcdir" && find . -type d -print | tar c --files-from - --no-recursion | tar x --directory "$dstdir"
این دستور با find لیستی از نام دایرکتوریها ایجاد میکند، به طور غیر بازگشتی فقط نام دایرکتوریها را به یک آرشیو اضافه میکند، و آنرا از طریق لوله به دومین tar میدهد که در محل مقصد آن را استخراج کند. به طوری که میتوانید ببینید، tar کمترین مناسبت را برای این منظور دارد، اما اشخاص فقط شیفته آن هستند، بنابراین فقط برای آرام کردن جمعیت علاقمندان tar در اینجا گنجانده شده. (توجه: حتی شما به هیچوجه نمیتوانید این را با یک tar معمولی یونیکس انجام بدهید. همچنین توجه کنید: چیزی به عنوان "standard tar" وجود ندارد، در نتیجه هردو برنامه tar و cpio به لطف pax به طور عمدی در POSIX از قلم افتادهاند.)
اگر نام دایرکتوریها شامل کاراکترهای سطرجدید باشد راه حل zsh فوق تقریبا شکست میخورد. دست کم در بسیاری سیستمهای مدرن BSD/GNU، آنها برای از عهده برآمدن، میتوانند با استفاده از find -print0 و یکی از موارد pax -0 یا cpio -0 یا tar --null به طور جزئی اصلاح شوند(مستندات سیستم خود را برای دیدن آنکه کدام یک از این برنامهها را دارید، و کدام ملحقات در دسترس میباشند، بررسی نمایید).
اگر میخواهید به جای فایلهای کامل، فایلهای بدون محتوا(خالی) با find(1) گنو ایجاد کنید، مورد ذیل احتمالاً سادهترین روش است.فرمان find فایلهای معمولی رابه طور مصنوعی(فایلهای خالی با همان نشانههای زمان) بازتولید میکند:
cd "$srcdir" && # :اول با یکی از فرمانهای فوق دایرکتوریها را ایجاد نمایید، سپس find . -type f -exec touch -r {} "$destination"/{} \;
آگاه باشید،به هرحال، مطابق POSIX، وقتی {} به عنوان یک شناسه حضور ندارد، رفتار find مشخص نشده است. به این دلیل، راه حل پایین قابل حملتر(و احتمالاً سریعتر) از مورد قبلی است:
dstdir=whatever; export dstdir find . -type f -exec sh -c 'for i; do touch -r "$i" "$dstdir"/"$i"; done' _ {} +
اگر برنامه find شما نمیتواند -exec + را مدیریت نماید،آنوقت میتوانید از \; به جای + در انتهای فرمان استفاده کنید. برای توضیحات UsingFind را ملاحظه نمایید.
پرسش و پاسخ 10 (آخرین ویرایش 2011-05-27 12:22:09 توسط GreyCat)