linux - 提取不带扩展名的文件基名

标签 linux shell unix

我正在尝试使用 find 命令在我的目录中递归地列出所有 pdf 文件:

find -name "*.pdf" > all_pdf.txt

输出正确,如图所示(all_pdf.txt):

./C++/data structures , algorithms and applications in c++ by sartraj sahani.pdf
./C++/C++Complete Reference (3rd Ed.).pdf
./C++/Bjarne Stroustrup - The C++ Programming Language(Third Edition).pdf
./C++/Essential_C++.pdf
./C++/Stawww.free-ebooks-cloud.com --nley B. Lippman - C++ Primer, Fourth Edition-signed.pdf
./C++/c_primer_5th_edition.pdf
./C++/C++ for Dummies 5th Ed.pdf
./C++/C++ Programming for the Absolute Beginner, Second Edition.pdf
./C++/c++_by_balaguruswamy/balagurusami_objectoriented_programming_cPP.pdf
./C++/c++_by_balaguruswamy/alagurusami_objectoriented_programming_cCh8to10__(1).pdf
./C++/c++_by_balaguruswamy/balagurusami_objectoriented_programming_cCh1to5__.pdf
./C++/c++_by_balaguruswamy/balagurusami_objectoriented_programming_cCh5to7__.pdf
./C++/c++_by_balaguruswamy/lagurusami_objectoriented_programming_cCh11to17__.pdf
./JQUERY/jQuery UI.pdf
./JQUERY/prototype-151-api.pdf
./JQUERY/jquery_succinctly.pdf
./JQUERY/learning_jquery_3rd_edition.pdf
./JQUERY/pro_php_and_jquery.pdf
./JQUERY/Learning jQuery, 4th Edition.pdf
./JQUERY/codeschool_try_jquery.pdf
./JQUERY/jQuery Game Development Essentials.pdf
./JQUERY/Manning.jQuery.in.Action.2nd.Edition.Jun.2010.pdf
./JQUERY/cdn.bitbucket.org-JQuery_Documentation.pdf
./JQUERY/Professional jQuery.pdf

但我的要求是只列出所有文件的 basename,不带扩展名,例如:

c_primer_5th_edition.pdf
C++Complete Reference (3rd Ed.).pdf
Bjarne Stroustrup - The C++ Programming Language(Third Edition).pdf
...

如何通过提供 filename(在本例中为“all_pdf.txt”)作为 basename 命令的参数来做到这一点。

最佳答案

使用sed

要从 all_pdf.txt 中的每一行中删除目录名称,请使用:

$ sed -e 's|.*/||' all_pdf.txt 
data structures , algorithms and applications in c++ by sartraj sahani.pdf
C++Complete Reference (3rd Ed.).pdf
Bjarne Stroustrup - The C++ Programming Language(Third Edition).pdf
Essential_C++.pdf
[...snip...]

如果您还想删除文件扩展名,请使用:

$ sed -e 's|.*/||' -e 's|\.pdf$||' all_pdf.txt 
data structures , algorithms and applications in c++ by sartraj sahani
C++Complete Reference (3rd Ed.)
Bjarne Stroustrup - The C++ Programming Language(Third Edition)
Essential_C++
[...snip...]

使用grep

$ grep -o '[^/]*$' all_pdf.txt 
data structures , algorithms and applications in c++ by sartraj sahani.pdf
C++Complete Reference (3rd Ed.).pdf
Bjarne Stroustrup - The C++ Programming Language(Third Edition).pdf
Essential_C++.pdf
[...snip...]

同时删除 .pdf 扩展名:

$ grep -Po '[^/]*(?=.pdf$)' all_pdf.txt 
data structures , algorithms and applications in c++ by sartraj sahani
C++Complete Reference (3rd Ed.)
Bjarne Stroustrup - The C++ Programming Language(Third Edition)
Essential_C++
[...snip...]

使用awk

$ awk '{sub(/.*\//, "")} 1' all_pdf.txt 
data structures , algorithms and applications in c++ by sartraj sahani.pdf
C++Complete Reference (3rd Ed.).pdf
Bjarne Stroustrup - The C++ Programming Language(Third Edition).pdf
Essential_C++.pdf
[...snip...]

同时删除 .pdf 扩展名:

$ awk '{sub(/.*\//, ""); sub(/\.pdf$/, "")} 1' all_pdf.txt 
data structures , algorithms and applications in c++ by sartraj sahani
C++Complete Reference (3rd Ed.)
Bjarne Stroustrup - The C++ Programming Language(Third Edition)
Essential_C++
[...snip...]

关于linux - 提取不带扩展名的文件基名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26457958/

相关文章:

c++ - 给 double 类型的变量赋值引起的浮点异常

linux - linux 服务器中 mod_qos 配置(.conf)的位置是什么?

linux - Bash/Shell 脚本中的安全输入验证

Linux内核编译错误

shell - 如何从一个位置参数生成两个变量?

java - 如何使用 java 或 shell 脚本查找 unix/linux 系统信息?

linux - 从 C 源文件生成 LLVM 位码文件的 CMakeList 文件

c - 在 Ubuntu 的终端中查找文件及其在目录中的路径,argv [2] 中给出的文件名

c++ - 使用 execv 和 shell exec 的问题

linux - 删除 shell 中以某个字符开头的行,但保留负值