ইউনিক্স - ফোল্ডার এবং ফাইলের পথ তৈরি করুন


125

আমি জানি যে আপনি mkdirডিরেক্টরি তৈরি করতে এবং touchএকটি ফাইল তৈরি করতে পারেন তবে উভয় ক্রিয়াকলাপ এক সাথে করার কোনও উপায় নেই?

অর্থাত্ যদি ফোল্ডারটি otherউপস্থিত না থাকে তবে আমি নীচে করতে চাই :

cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

ত্রুটি:

cp: cannot create regular file `/my/other/path/here/cpedthing.txt': No such file or directory

কেউ কি এর জন্য একটি কর্মফল হিসাবে একটি ফাংশন নিয়ে এসেছেন?



যদি ফাইল এবং এর ডিরেক্টরিটি পরমাণু হওয়া অপরিহার্য হয় তবে আপনাকে একটি ফাইল সিস্টেম লিখতে হবে যা এই অপারেশনটি সরবরাহ করে। এটি স্ট্যান্ডার্ড লিনাক্স ফাইল সিস্টেমগুলির দ্বারা সম্ভব নয়।
পিটার জি।

@ টপ আমি বুঝতে পারি যে এই প্রশ্নটি এখন দেড় বছরের পুরানো, তবে বেশ কয়েকটি উত্তর সম্প্রতি এতে একীভূত হয়েছিল। আপনার যদি খুব প্রায়ই এই ধরণের জিনিসটির প্রয়োজন হয় তবে আপনি আমার উত্তরটি দরকারী বলে মনে করতে পারেন । (আমি গৃহীত উত্তরের চেয়ে আরও কার্যকর যুক্তি জানাতে চাই, তবে আমি এখানে প্রতিবেদনের জন্য ভিক্ষা করছি না :-))
জনাথন রেইনহার্ট

এটি পাওয়া গেছে: stackoverflow.com/a/8722721/29182
Ziggy

@ টেডামার্স প্রশ্ন: "আমি এক্স কীভাবে করব?" উত্তর: "এখানে ওয়াই কীভাবে করবেন"
হেনরি হেনরিসন

উত্তর:


139

&&একটি শেল লাইনে দুটি কমান্ড একত্রিত করতে ব্যবহার করুন :

COMMAND1 && COMMAND2
mkdir -p /my/other/path/here/ && touch /my/other/path/here/cpedthing.txt

দ্রষ্টব্য: পূর্বে আমি ;দুটি কমান্ড পৃথক করার জন্য ব্যবহারের পরামর্শ দিয়েছিলাম তবে @ ট্রাইসিস দ্বারা চিহ্নিত হিসাবে সম্ভবত &&বেশিরভাগ পরিস্থিতিতে এটি ব্যবহার করা ভাল কারণ COMMAND1ব্যর্থতার ক্ষেত্রেও COMMAND2কার্যকর হয় না। (অন্যথায় এটি এমন সমস্যাগুলির দিকে নিয়ে যেতে পারে যা আপনি প্রত্যাশা করেননি))


16
সম্ভবত আরও ভাল ব্যবহার করার &&মতো ;, যদি প্রথম কমান্ডটি ব্যর্থ হয় তবে দ্বিতীয় কমান্ডটি চলবে (এবং ব্যর্থও হবে, কারণ ডিরেক্টরিটি এখনও বিদ্যমান নেই)। সঙ্গে &&যদি প্রথম কমান্ড ব্যর্থ হয়, দ্বিতীয় কমান্ড চলে না।
ট্রিপসিস

12
কোড উদাহরণস্বরূপ একটি ছোট কাটা হতে পারে: mkdir -p /my/other/path/here && touch $_/cpredthing.txt$_মূলত বিস্তৃতি "সর্বশেষ কমান্ড গত যুক্তি মৃত্যুদন্ড কার্যকর"।
Sgnl

4
@ স্নেল আপনার নিজের পক্ষে যুক্তিযুক্ত সঠিক উত্তর। এটি কেবল পরিষ্কার নয়, এটি ত্রুটি-প্রবণতাও কম।
কোয়েলটন বি হিগগিনবটম

3
আমি সত্যিই touchএকটি -pপরামিতি মত চান mkdir
Ben174

86

আপনাকে প্রথমে সমস্ত অভিভাবক ডিরেক্টরি তৈরি করতে হবে।

FILE=./base/data/sounds/effects/camera_click.ogg

mkdir -p "$(dirname "$FILE")" && touch "$FILE"

আপনি যদি সৃজনশীল পেতে চান তবে আপনি একটি ফাংশন করতে পারেন :

mktouch() {
    if [ $# -lt 1 ]; then
        echo "Missing argument";
        return 1;
    fi

    for f in "$@"; do
        mkdir -p -- "$(dirname -- "$f")"
        touch -- "$f"
    done
}

এবং তারপরে এটি অন্য কোনও আদেশের মতো ব্যবহার করুন:

mktouch ./base/data/sounds/effects/camera_click.ogg ./some/other/file

এটি ব্যবহারের জন্য পরিবর্তিত হয়েছে &&- এটি কেমন?
জোনাথন রাইনহার্ট

1
@ BЈовић হ্যাঁ । (আমি তাদের পোস্ট করার আগে আমি পরীক্ষার চেষ্টা করি))
জোনাথন রেইনার্ট

2
@ জোনাথনরাইনহার্ট আপনি কি নিশ্চিত যে আপনি এটি পরীক্ষা করেছেন? আমি চেষ্টা করেছিলাম supertouch "/tmp/abc/def ghi/jkl mno.txt"এবং এটি ব্যর্থ হয়েছিল। সকল কমান্ড dirname, mkdirএবং toucherros দিলেন।
ডিভনুল

2
@ ডিভনুল স্পষ্টতই যথেষ্ট যথেষ্ট নয়। অভিশাপ আপনার স্থান :-) স্থির।
জোনাথন রাইনহার্ট

1
পছন্দ করুন mktouchএইটা.
জোনাথন রাইনহার্ট

24

/ Usr / বিন / ইনস্টল দিয়ে এটি করুন:

install -D /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

যখন আপনার কাছে সোর্স ফাইল নেই:

install -D <(echo 1) /my/other/path/here/cpedthing.txt

1
আমি অবাক হই এই রত্ন সরঞ্জামটি বেশিরভাগ ক্ষেত্রে উপেক্ষা করা হয় - ম্যান ইনস্টল - দেখায় যে ইনস্টলটি আরও ভাল সমাধান।
এসসি-এসএল

1
আপনি এটিও ব্যবহার করতে পারেন -D /dev/nullযা আমার মনে রাখা সহজ।
উইসবাকি

14

এটি আমি করতাম:

mkdir -p /my/other/path/here && touch $_/cpredthing.txt

এখানে, $_একটি ভেরিয়েবল যা পূর্ববর্তী কমান্ডের শেষ যুক্তিটি উপস্থাপন করে যা আমরা লাইনে কার্যকর করি।

আউটপুটটি কী হতে পারে তা আপনি যদি দেখতে চান তবে আপনি echoকমান্ডটি ব্যবহার করে এটি পরীক্ষা করতে পারেন :

echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt

যা ফলাফল হিসাবে:

mkdir -p /code/temp/other/path/here
touch /code/temp/other/path/here/cpredthing.txt

বোনাস হিসাবে, আপনি একবারে ব্রেস প্রসারণ ব্যবহার করে একাধিক ফাইল লিখতে পারেন, উদাহরণস্বরূপ:

mkdir -p /code/temp/other/path/here &&
touch $_/{cpredthing.txt,anotherfile,somescript.sh}

আবার, এর সাথে সম্পূর্ণ পরীক্ষামূলক echo:

mkdir -p /code/temp/other/path/here
touch /code/temp/other/path/here/cpredthing.txt /code/temp/other/path/here/anotherfile /code/temp/other/path/here/somescript.sh

13
#!/bin/sh
for f in "$@"; do mkdir -p "$(dirname "$f")"; done
touch "$@"

1
কোনও অনামী ব্যবহারকারীর dirname -z "$@" | xargs -0 mkdir -pপরিবর্তে পারফরম্যান্সের জন্য ব্যবহার করার পরামর্শ দেওয়া (সম্পাদনার মাধ্যমে) । (পিট
খাওয়ার জন্য লুকোচুরি



2

যেহেতু আমি একটি ইউনিক্স ফোরামে দেখেছি এবং পরীক্ষা করেছি এটি সমস্যার সমাধান করে

ptouch() {
    for p in "$@"; do
        _dir="$(dirname -- "$p")"
        [ -d "$_dir" ] || mkdir -p -- "$_dir"
    touch -- "$p"
    done
}

1

if thenবিবৃতি দেওয়ার দরকার নেই ... আপনি এটি একক লাইনে ব্যবহার করতে পারেন;

mkdir -p /my/other/path/here;cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

- বা দুটি লাইনে -

mkdir -p /my/other/path/here
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

- -pডিরেক্টরি ইতিমধ্যে উপস্থিত থাকলে ত্রুটি প্রত্যাবর্তন প্রতিরোধ করে (যা আমি এখানে এসেছি :)


1

বিশেষ (তবে অস্বাভাবিক নয়) ক্ষেত্রে আপনি একই ডিরেক্টরি ক্রমবিন্যাসটি পুনরায় তৈরি করার চেষ্টা করছেন যেখানে cp --parentsএটি কার্যকর হতে পারে।

উদাহরণস্বরূপ যদি /my/longউত্স ফাইলগুলি my/otherথাকে এবং ইতিমধ্যে বিদ্যমান থাকে তবে আপনি এটি করতে পারেন:

cd /my/long
cp --parents path/here/thing.txt /my/other

-4

যদি আপনি কেবল 1 টি প্যারাম স্নিপেট সহ সহজ চান:

rm -rf /abs/path/to/file;  #prevent cases when old file was a folder
mkdir -p /abs/path/to/file; #make it fist as a dir
rm -rf /abs/path/to/file; #remove the leaf of the dir preserving parents 
touch /abs/path/to/file; #create the actual file

3
আপনি যদি গত কয়েক ঘন্টা † কাজটি থেকে কেবল মুক্তি পেতে চান তবে কৃতজ্ঞতার সাথে কিছু rm -rfকমান্ডের আশেপাশে নিক্ষেপ করুন । - hours এটি, ঘন্টা , ধরে নিচ্ছি যে আপনি একটি বুদ্ধিমান সংস্করণ নিয়ন্ত্রণ / ব্যাকআপ নীতিটি মেনে চলেন ... অন্যথায়, এটি বেশ কয়েক মাস হতে পারে।

1
rm -rfযথাযথ ব্যাখ্যা এবং সতর্কতা ছাড়া কখনও পরামর্শ দেওয়া উচিত নয়।
Mausy5043
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.