sedを使用してファイル名のみを取得する方法は?私はこれを持っています
out_file=$(echo $in_file|sed "s/\(.*\.\).*/\1mp4/g")
しかし、私も道を得て、/root/video.mp4
それが私が望むすべてですvideo.mp4
。
答え1
basename
GNUからコアツールこれを行うのに役立ちます。
$ basename /root/video.mp4
video.mp4
ファイル拡張子が既にわかっている場合は、basename
次の構文を使用して呼び出してbasename NAME [SUFFIX]
削除できます。
$ basename /root/video.mp4 .mp4
video
または、別のオプションは、次を使用して最後のポイント以降のすべてを切り取ることですsed
。
$ basename /root/video.old.mp4 | sed 's/\.[^.]*$//'
video.old
答え2
最も簡単な解決策は最後まですべてを削除することです/
。
echo /root/video.mp4 | sed 's/.*\///'
答え3
次のいずれかの方法を使用します。
out_file="${in_file##*/}"
out_file="$(basename $in_file)"
out_file="$(echo $in_file | sed 's=.*/==')"
out_file="$(echo $in_file | awk -F"/" '{ print $NF }')"
\(.*\.\)
注:ステートメントは開始からポイント()までの/root/video.
文字列と一致し、.mp4
元の文字列と同じ文字列を手動で追加するため、同じ文字列を取得します。を使用する必要がありますs=.*\([^/]*\)=\1=
。
アップデート:(最初のアイテムは今修正されました。)
拡張子なしで一意のファイル名を取得するには、次のようにします。
out_file="$(echo $in_file | sed 's=.*/==;s/\.[^.]*$/.new_ext/')"
out_file="$(echo $in_file | sed 's=\([^/]*\)\.[^./]*$=\1.new_ext=')"
out_file="$(echo $in_file | awk -F"/" '{ gsub (/\.[^/.]*$/,".new_ext",$NF);print $NF }'
答え4
POSIXly、ディレクトリ名と拡張子を削除します。
rootname() {
LC_ALL=C awk -- 'BEGIN{
for (i = 1; i < ARGC; i++) {
file = ARGV[i]
if (file == "")
print ""
else {
sub("/*$", "", file) # remove trailing / characters if any
if (file == "")
print "/"
else {
sub(".*/", "", file) # remove dir part
if (file ~ /[^.]\./) # has a . other than as the first character
# also do not consider . and .. have an extension
sub(/\.[^.]*$/, "", file)
print file
}
}
}
}' "$@"
}
例:
$ rootname ~/.zshrc
.zshrc
$ rootname foo/bar/
bar
$ rootname /
/
$ rootname ""
$ rootname .foo.bar
.foo
$ rootname file.tar.gz
file.tar
$ rootname foo.d/bar
bar
$ rootname $'foo.d/\nbar.x'
bar
csh、tcsh、zsh、bash、またはvimの場合:t
(尾)と:r
(根) 修飾子を組み合わせて:t:r
取得できます。根~の尾しかし、注意してください:
- は
bash
履歴拡張でのみ使用可能であるため、変数の内容に適用する必要がある場合は便利ではありません。 rootname
コーナーケース値(例:)または拡張子のない隠しファイル(例:)については、上記の関数とは/
異なる結果を..
得ることができます。~/.cshrc
- を除いて、
zsh
withは空の文字列にfile=/foo/bar/
展開されます。$file:t:r
を使用して同じことを実行できますが、sed
使用するほど明確ではありませんawk
。
rootname() {
printf '%s\n' "$1" | LC_ALL=C sed '
:1
$!{
N; # load full input into pattern space for filenames with newlines
b1
}
# handle the empty string
/./!b
# remove trailing slashes
s|/*$||
/./! {
# handle slash
s|^|/|
b
}
s|.*/||; # remove dir part
/[^.]\./ s/\.[^.]*$//'
}