Txt ফাইল থেকে একটি নাম দিয়ে ডিরেক্টরি তৈরি করুন যাতে '/' অক্ষর থাকে


8

আমার কাছে একটি .txt ফাইল রয়েছে যাতে এটির মতো একটি টেক্সট থাকে

A1/B1/C1
A2/B2/C2 
A3/B3/C3

আমি এমন একটি স্ক্রিপ্ট চাই যা প্রতিটি লাইনের জন্য .txt ফাইলটি পড়ে এবং তারপরে প্রথম শব্দের উপর ভিত্তি করে একটি ডিরেক্টরি তৈরি করে (এ 1, এ 2, এ 3)

আমি এর মতো স্ক্রিপ্ট তৈরি করেছি:

file="test.txt"
while IFS='' read -r line
do
    name="line"
    mkdir -p $line
done <"$file"

আমি এটি চালানোর সময় এটি ডিরেক্টরি এ 1 তৈরি করে এরপরে এটি উপ-ডিরেক্টরি বি 1 এবং সি 1 তৈরি করে। অন্য লাইনের (এ 2 * এবং এ 3 *) এর ক্ষেত্রেও একই ঘটনা ঘটে

কেবলমাত্র A1, A2, A3 ডিরেক্টরি তৈরি করতে আমার কী করা উচিত?

আমি এটিতে '/' চরিত্রের সাথে নামটি A1 / B1 / C1 এর মতো করতে চাই না। আমি কেবল '/' চরিত্রের আগে শব্দটি নিয়ে এটি ডিরেক্টরি নাম করতে চাই। কেবল "এ 1" "এ 2" "এ 3"।

উত্তর:


13

আপনি শুধু পারেন St slash- প্রতিটি লাইনের elimited ক্ষেত্র এবং তালিকাভুক্ত করা হবে :cut1dmkdir

mkdir $(<dirlist.txt cut -d/ -f1)

উদাহরণ রান

$ cat dirlist.txt 
A1/A2/A3
B1/B2/B3
C1/C2/C3
$ ls
dirlist.txt
$ mkdir $(<dirlist.txt cut -d/ -f1)
$ ls
A1  B1  C1  dirlist.txt

আপনার তালিকায় বিপুল সংখ্যক ডিরেক্টরি নাম থাকলে এই ক্ষেত্রে জিএনইউ বা নীচে ব্যবহার করুন : আপনি এআরজি_এমএক্স সমস্যায় পড়তে পারেন :parallel সমান্তরাল ইনস্টল করুনxargs

parallel mkdir :::: <(<dirlist.txt cut -d/ -f1)
xargs -a<(<dirlist.txt cut -d/ -f1) mkdir

যদিও parallelহয়েছে সেটিকে ঢেকে দিয়েছে xargsপদ্ধতির কাজ না হলে ডিরেক্টরির নাম খালি জায়গা থাকা হবে - আপনি হয় ব্যবহার করতে পারেন \0লাইন বিভেদক হিসাবে অথবা কেবল নির্দেশ xargsকেবল সম্পর্কে newline অক্ষর ইনপুট বিভক্ত (যেমন দ্বারা প্রস্তাবিত মার্টিন বোনার ) পরিবর্তে:

xargs -0a<(<dirlist.txt tr \\{n,0} | cut -d/ -f1 -z) mkdir # \\{n,0} equals \\n \\0
xargs -d\\n -a<(<dirlist.txt cut -d/ -f1) mkdir

ক্ষেত্রে যদি কোনও ক্ষেত্রে একটি নতুন লাইন অক্ষর থাকে তবে একটিটিকে "সত্য" লাইন শেষ চিহ্নিত করতে হবে এবং কেবলমাত্র সেই নতুন লাইনের অক্ষরগুলিকে উদাহরণস্বরূপ প্রতিস্থাপন করতে হবে \0। এটি একটি ক্ষেত্রে হবে awk, তবে আমি মনে করি এটি এখানে খুব দূরে পাওয়া গেছে।


xargs -a<(....)তার চেয়ে কেন <dirlist.txt cut -d/ -f1 | xargs?
মার্টিন বোনার

1
@ মার্টিনবোনার স্পষ্ট করার জন্য ধন্যবাদ, এটি আমার trপদ্ধতির চেয়ে সত্যই সহজ - ঠিক বুঝতে পেরেছি যে parallelএটি ডিফল্টরূপে আচ্ছাদন করেছে।
মিষ্টান্ন

@ মার্টিনবোনার কেন xargs -a<(....)পাইপের চেয়ে বেশি - কেননা আমি এটি এতটাই পছন্দ করি as :)
মিষ্টি

@ আন্দ্রে কার্বেলিনী ওহ, এখন আমি বুঝতে পেরেছি। <(...)স্পেসগুলি পাশাপাশি সহায়তা করে, তাই এটি অবশ্যই আরও ভাল পছন্দ - আমার মনে হয় না যে কেউ যে কোনওভাবেই এই ফাইল বর্ণনাকারী ব্যবহার করছে using
ডেজার্ট

@ মার্টিনবোনার আরও আকর্ষণীয়ভাবে: কেন কেবল ন্যায়বিচারের cut <dirlist.txtপরিবর্তে cut dirlist.txt?
মিষ্টি

11

আপনার IFS='/'জন্য নিজের সেট করতে হবে readএবং তারপরে প্রতিটি প্রথম ক্ষেত্রকে পৃথক ভেরিয়েবল firstএবং বাকী ক্ষেত্রগুলিকে ভেরিয়েবলের মধ্যে বরাদ্দ করতে হবে restএবং কেবল প্রথম ক্ষেত্রের মান হিসাবে কাজ করতে read -ar arrayহবে (অথবা আপনি একটি একক অ্যারেতে এবং "${array[0]}"প্রথম ক্ষেত্রের মানের জন্য ব্যবহার করতে পারেন ):

while IFS='/' read -r first rest;
do
    echo mkdir "$first" 
done < test.txt

বা যারা পছন্দ করেন তাদের জন্য একক লাইনে:

<test.txt xargs -d'\n' -n1 sh -c 'echo mkdir "$'{1%%/*}'"' _

বা একযোগে সমস্ত ডিরেক্টরি তৈরি করুন:

<test.txt xargs -d'\n' bash -c 'echo mkdir "$'{@%%/*}'"' _

ANSI-সি বরাত দিয়ে$'...' ডিরেক্টরির বিশেষ অক্ষর ধারণকারী নামের সাথে মোকাবেলা করতে ব্যবহার করা হয়।

লক্ষ্য করুন _শেষে (যে কোন অক্ষর বা স্ট্রিং হতে পারে) argv হয় হতে হবে [0] এ bash -c '...'এবং $@ইচ্ছা 1 থেকে শুরু পরামিতি বাকি উপস্থিত রয়েছে; এটি না করে দ্বিতীয় কমান্ডে প্রথম প্যারামিটারটি নষ্ট হয়ে mkdirযাবে।

ইন ${1%%/*}ব্যবহার শেল (POSIX SH / ব্যাশ / Korn থেকে / zsh) প্যারামিটার প্রতিকল্পন সম্প্রসারণ , অপসারণ স্ল্যাশ দীর্ঘতম সম্ভব ম্যাচ প্যারামিটার তা ক্ষণস্থায়ী যা একটি লাইন যে পড়তে হয় শেষ পর্যন্ত কিছু দ্বারা অনুসরণ xargs ;

পুনশ্চ:

  • সরান echoসামনে mkdirঐ ডিরেক্টরি তৈরি করুন।
  • আপনার তালিকাটি ইওলাইনটির পরিবর্তে NUL টি অক্ষরের সাথে পৃথক করা থাকলে (আপনার ডিরেক্টরিটির নামের মধ্যে নতুন লাইন এম্বেড করা আছে / মনে করা হয়) এর -d'\n'সাথে প্রতিস্থাপন করুন ।-0\n

6

এর উপাদানসমূহ test.txt:

A 12"x4" dir/B b/C c
A1/B1/C1
A2/B2/C2
A3/B3/C3

A[123]ফোল্ডার তৈরির স্ক্রিপ্ট :

file="test.txt"
while read -r line ; do
   mkdir "${line%%/*}"
done < "$file"

এর আউটপুট ls:

A 12"x4" dir
A1
A2
A3

: তোমার মত ইনপুট কিভাবে মোকাবেলা করবেন A 12"x4" dir/B b/C c?
ওলে টেঞ্জ

ওলে টেঙে - এই মন্তব্যটি প্রশ্নের পুরোপুরি সুযোগের বাইরে বলে মনে হচ্ছে।
ডকসালভাইজার

4

প্রশ্নের ইনপুট উদাহরণে যেমন দেখানো হয়েছে তেমন সহজ ক্ষেত্রে, কেবল cut আউটপুটটি ব্যবহার করে পাস mkdirকরুনxargs

cut -f1 -d '/' file.txt | xargs -L1 mkdir 

ডিরেক্টরিগুলির নাম ফাঁকা থাকতে পারে এমন ক্ষেত্রে পরিচালনা করার জন্য আমরা -d '\n'বিকল্পগুলির তালিকায় যুক্ত করতে পারি :

$ cat input.txt 
A 1/B 1/C 1
A 2/B 2/C 2
A 3/B 2/C 2
$ cut -f1 -d '/' input.txt | xargs -d '\n' mkdir 
$ ls
A 1  A 2  A 3  input.txt

A 12"x4" dir/B b/C cমন্তব্যগুলিতে @ ওলেট্যাঞ্জের পরামর্শ মতো আরও জটিল প্রকরণের জন্য , কেউ awkনিউলাইন-বিচ্ছিন্ন তালিকার পরিবর্তে নাল-বিচ্ছিন্ন তালিকা তৈরি করতে পারে ।

awk -F'/' '{printf  "%s\0",$1}' input.txt |  xargs -0 mkdir

@ মন্তব্যগুলিতে মন্তব্যকারী আশ্চর্য হয়েছিলেন যে printfপরিবর্তে এটি ব্যবহার করা যায় কি না cutএবং প্রযুক্তিগতভাবে এটি ব্যবহার করা যায় কিনা উদাহরণস্বরূপ, মুদ্রিত স্ট্রিংটি কেবলমাত্র 3 টি অক্ষরের প্রস্থের মধ্যে সীমাবদ্ধ করে:

xargs -d '\n' printf "%.3s\n"  < input.txt | xargs -L1 mkdir 

সবচেয়ে পরিষ্কার উপায় নয়, তবে এটি প্রমাণিত printf হয়। অবশ্যই, যদি ডিরেক্টরিটির নামটি 3 টি অক্ষরের বেশি হয়ে যায় তবে এটি সমস্যাযুক্ত হয়ে ওঠে।


: তোমার মত ইনপুট কিভাবে মোকাবেলা করবেন A 12"x4" dir/B b/C c?
ওলে টেঞ্জ

@ ওলেটটাইজ সম্পাদনা দেখুন।
সের্গেই কোলোডিয়াজনি

2

পার্ল ব্যবহার:

perl -ne 'mkdir for /^(\w+)/' list.txt

অথবা

perl -ne 'mkdir for /^([^\/]+)/' list.txt

আমরা যদি dir- নাম নিয়ে ফাঁকা স্থান গ্রহণ করতে চান


1
perl -ne 'mkdir for /^([^\/]+)/' list.txtদির নামে ফাঁকা স্থান। আমাকে শেষ পর্যন্ত পার্ল শিখতে হবে - ধন্যবাদ!
মিষ্টি

0

GNU সমান্তরাল কাজটির জন্য ওভারকিল হতে পারে তবে আপনি যদি প্রতিটি লাইনের জন্য অন্য জিনিসগুলি করতে চলেছেন তবে এটি কার্যকর হতে পারে:

cat myfile.txt | parallel --colsep / mkdir {1}
parallel -a myfile.txt --colsep / mkdir {1}

এটি ইনপুটগুলির মতো সঠিকভাবে ডিল করে:

A 12"x4" dir/B b/C c
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.