সুতরাং, বলুন, আমার কাছে g.txt এর মতো গুচ্ছ ফাইলের একটি ডিরেক্টরি রয়েছে, যেখানে g.txt সর্বশেষে 20 জুন, 2012-এ সংশোধন করা হয়েছিল।
২০ শে জুন, ২০১২ শেষ সংশোধিত তারিখের শেষে আমি কীভাবে সমস্ত ফাইল (g.txt) এর নাম পরিবর্তন করব?
সুতরাং, বলুন, আমার কাছে g.txt এর মতো গুচ্ছ ফাইলের একটি ডিরেক্টরি রয়েছে, যেখানে g.txt সর্বশেষে 20 জুন, 2012-এ সংশোধন করা হয়েছিল।
২০ শে জুন, ২০১২ শেষ সংশোধিত তারিখের শেষে আমি কীভাবে সমস্ত ফাইল (g.txt) এর নাম পরিবর্তন করব?
উত্তর:
দ্রুত-এবং-মলিন ব্যাশ এক-লাইনের থেকে বর্তমান ডিরেক্টরির মধ্যে সমস্ত (globbed) ফাইল নামান্তর করতে filename.txt
করতে filename.txt-20120620
:
for f in *; do mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"; done
একটি উদ্যোগী বাশ নার্দ এটি ভাঙ্গার জন্য কিছু প্রান্তের কেস খুঁজে পাবে, আমি নিশ্চিত। :)
স্পষ্টতই, এটি কোনও ফাইলে ইতিমধ্যে শেষের তারিখের মতো দেখতে এমন কিছু আছে কিনা তা যাচাই করার মতো পছন্দসই কাজ করে না।
date
বাস্তবায়ন? আমার জিএনইউ date
ইনপুট পরিচালনা করছে বলে মনে হচ্ছে না।
এখানে সোনারশ্রাফির ওয়ান-লাইনারের একটি সংস্করণ এখানে রয়েছে:
ড্যাশ দিয়ে শুরু হওয়া ফাইলের নামগুলিও অনুলিপি করে
for f in *; do mv -- "$f" "$f-$(date -r "$f" +%Y%m%d)"; done
date -r "$f" +%Y%m%d
বা POSIXLY_CORRECT
পরিবেশে থাকলে এটি কাজ করবে না । সাধারণত, অন্যান্য যুক্তিগুলির আগে বিকল্পগুলি হওয়া উচিত।
"${f}"
।
বাধ্যতামূলক zsh ওয়ান-লাইনার (componentsচ্ছিক উপাদানগুলির এক-সময়ের লোড গণনা করা নয়):
zmodload zsh/stat
autoload -U zmv
zmv -n '(*)' '$1-$(stat -F %Y%m%d +mtime -- $1)'
আমরা মডিউলstat
থেকে বিল্টিন এবং ফাইলগুলির নাম পরিবর্তন করতে ব্যবহার করি। এবং এখানে একটি অতিরিক্ত যা এক্সটেনশনের আগে তারিখটি রাখে, যদি থাকে।zsh/stat
zmv
zmv -n '(*)' '$1:r-$(stat -F %Y%m%d +mtime -- $1)${${1:e}:+.$1:e}'
আমি যেমন বুঝতে পেরেছি আমরা আগেই জানিনা যে পরিবর্তনের তারিখটি কী। সুতরাং আমাদের এটি প্রতিটি ফাইল থেকে নেওয়া, আউটপুট ফর্ম্যাট করা এবং প্রতিটি ফাইলের এমনভাবে নামকরণ করা দরকার যাতে এটি ফাইলের নামগুলিতে পরিবর্তনের তারিখ অন্তর্ভুক্ত করে।
আপনি এই স্ক্রিপ্টটিকে "modif_date.sh" এর মতো কিছু হিসাবে সংরক্ষণ করতে এবং এটি সম্পাদনযোগ্য করে তুলতে পারেন। আমরা এটি আর্গুমেন্ট হিসাবে লক্ষ্য ডিরেক্টরিতে অনুরোধ করি:
modif_date.sh txt_collection
"Txt_colલેક્શન" হ'ল ডিরেক্টরিটির নাম যেখানে আমাদের কাছে থাকা সমস্ত ফাইল রয়েছে যা আমরা নাম পরিবর্তন করতে চাই।
#!/bin/sh
# Override any locale setting to get known month names
export LC_ALL=c
# First we check for the argument
if [ -z "$1" ]; then
echo "Usage: $0 directory"
exit 1
fi
# Here we check if the argument is an absolute or relative path. It works both ways
case "${1}" in
/*) work_dir=${1};;
*) work_dir=${PWD}/${1};;
esac
# We need a for loop to treat file by file inside our target directory
for i in *; do
# If the modification date is in the same year, "ls -l" shows us the timestamp.
# So in this case we use our current year.
test_year=`ls -Ggl "${work_dir}/${i}" | awk '{ print $6 }'`
case ${test_year} in *:*)
modif_year=`date '+%Y'`
;;
*)
modif_year=${test_year}
;;
esac
# The month output from "ls -l" is in short names. We convert it to numbers.
name_month=`ls -Ggl "${work_dir}/${i}" | awk '{ print $4 }'`
case ${name_month} in
Jan) num_month=01 ;;
Feb) num_month=02 ;;
Mar) num_month=03 ;;
Apr) num_month=04 ;;
May) num_month=05 ;;
Jun) num_month=06 ;;
Jul) num_month=07 ;;
Aug) num_month=08 ;;
Sep) num_month=09 ;;
Oct) num_month=10 ;;
Nov) num_month=11 ;;
Dec) num_month=12 ;;
*) echo "ERROR!"; exit 1 ;;
esac
# Here is the date we will use for each file
modif_date=`ls -Ggl "${work_dir}/${i}" | awk '{ print $5 }'`${num_month}${modif_year}
# And finally, here we actually rename each file to include
# the last modification date as part of the filename.
mv "${work_dir}/${i}" "${work_dir}/${i}-${modif_date}"
done
stat
ইউটিলিটি রয়েছে বা কিছুই নেই none
ls
নির্ভরযোগ্য নয় । কিছু ইউনিক্স ভেরিয়েন্টে ব্যবহারকারী এবং গোষ্ঠীর নামগুলিতে স্পেস থাকতে পারে যা তারিখের কলামগুলির প্রান্তিককরণ বন্ধ করে দেবে।
ls
হিসাবে প্রদর্শিত হবে (তারিখ এবং এক বছরের পরিবর্তে) অবশ্যই চলতি বছরে থাকতে হবে। এটি সত্য নয়। এটি গত ছয় মাসে; এটি পূর্ববর্তী বছরে হতে পারে (উদাহরণস্বরূপ, ২১-সেপ্টেম্বর -2016 এর মাধ্যমে 31-ডিসেম্বর -2016 গত ছয় মাসের মধ্যে রয়েছে)। ()) গ্রেগের উইকি (যা @ গিলস ইতিমধ্যে উদ্ধৃত করা হয়েছে) পোকার তোরণের ঝুঁকিতে, নতুন নাম (গুলি) এবং স্পেস যুক্ত ফাইলের নামগুলি এটি ব্যর্থ হতে পারে। … (চালিয়ে যাওয়া)
এখানে CA গুলির এর oneliner সংস্করণ, (goldschrafe এর oneliner উপর ভিত্তি করে) সঙ্গে বাড়ানো idempotence ,
অর্থাত্ তারিখের সময় সহ উপসর্গের ফাইলগুলিতে প্রসারিত এবং কেবলমাত্র তারিখের উপসর্গ নেই তাদের জন্য এটি করার জন্য ।
ব্যবহারের ক্ষেত্রে: সহায়ক যদি আপনি ডিরেক্টরিতে নতুন ফাইল যুক্ত করেন এবং যারা এখনও নেই তাদের সাথে তারিখের সময়ের উপসর্গ যুক্ত করতে চান helpful
for f in * ; do
if [[ "$f" != ????-??-??' '??:??:??' - '* ]]; then
mv -v -- "$f" "$(date -r "$f" +%Y-%m-%d' '%H:%M:%S) - $f" ;
fi;
done
for f in *.jpg ; do jhead -ft "$f" ; done
: উৎস unix.stackexchange.com/a/290755/9689