সমস্যা: পিতামাতার ডিরেক্টরিটির মূল নাম সহ ফাইলের শীর্ষে একটি ফাইল ট্যাগ করুন।
অর্থাৎ, জন্য
/mnt/Vancouver/Programming/file1
file1
সাথে শীর্ষে ট্যাগ Programming
।
সমাধান 1 - খালি খালি ফাইলগুলি:
bn=${PWD##*/} ## bn: basename
sed -i '1s/^/'"$bn"'\n/' <file>
1s
ফাইলটির 1 লাইনে পাঠ্য রাখে।
সমাধান 2 - খালি বা খালি খালি ফাইল:
sed
কমান্ড উপরে, খালি ফাইল ব্যর্থ। Https://superuser.com/questions/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash/246841#246841 এর উপর ভিত্তি করে এখানে একটি সমাধান রয়েছে
printf "${PWD##*/}\n" | cat - <file> > temp && mv -f temp <file>
নোট করুন যে -
ক্যাট কমান্ডটি প্রয়োজনীয় (স্ট্যান্ডার্ড ইনপুট: man cat
আরও তথ্যের জন্য দেখুন)। এখানে, আমি বিশ্বাস করি, প্রিন্টফেট স্টেটমেন্ট (এসটিডিআইএন) এর আউটপুট, এবং বিড়ালটি এবং ফাইলটি টেম্পোর করার দরকার ছিল ... http://www.linfo.org/cat এর নীচেও ব্যাখ্যাটি দেখুন .html ।
আমি আরও যোগ করেছেন -f
করতে mv
কমান্ড ফাইল মুছে যাওয়ার নিশ্চিতকরণ জন্য বলা হচ্ছে এড়ানো।
একটি ডিরেক্টরি পুনরাবৃত্তি করতে:
for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done
আরও মনে রাখবেন যে এটি ফাঁকা স্থানগুলির সাথে পাথগুলি ভেঙে দেবে; সমাধান আছে, অন্য কোথাও (যেমন ফাইল গ্লোব্বিং, বা- find . -type f ...
টাইপ সমাধান)।
যোগ করুন: পুনরায়: আমার শেষ মন্তব্য, এই স্ক্রিপ্টটি আপনাকে পাথের ফাঁকা জায়গাগুলির সাহায্যে ডিরেক্টরিতে পুনরাবৃত্তি করতে অনুমতি দেবে:
#!/bin/bash
## /programming/4638874/how-to-loop-through-a-directory-recursively-to-delete-files-with-certain-extensi
## To allow spaces in filenames,
## at the top of the script include: IFS=$'\n'; set -f
## at the end of the script include: unset IFS; set +f
IFS=$'\n'; set -f
# ----------------------------------------------------------------------------
# SET PATHS:
IN="/mnt/Vancouver/Programming/data/claws-test/corpus test/"
# /superuser/716001/how-can-i-get-files-with-numeric-names-using-ls-command
# FILES=$(find $IN -type f -regex ".*/[0-9]*") ## recursive; numeric filenames only
FILES=$(find $IN -type f -regex ".*/[0-9 ]*") ## recursive; numeric filenames only (may include spaces)
# echo '$FILES:' ## single-quoted, (literally) prints: $FILES:
# echo "$FILES" ## double-quoted, prints path/, filename (one per line)
# ----------------------------------------------------------------------------
# MAIN LOOP:
for f in $FILES
do
# Tag top of file with basename of current dir:
printf "[top] Tag: ${PWD##*/}\n\n" | cat - $f > temp && mv -f temp $f
# Tag bottom of file with basename of current dir:
printf "\n[bottom] Tag: ${PWD##*/}\n" >> $f
done
unset IFS; set +f
sed
।