有了路径名,就可以提取它的filename,不包括它的先验已知扩展名,basename:
$ pathname="/home/paulo/paulo.pdf"
$ printf "%s\n" "$(basename $pathname .pdf)"
paulo
但是,如果不知道扩展名怎么办?
我想知道我计算机上的处理器、磁盘和内部总线是否运行得足够快,可以以每秒 10 Gb 的速度从磁盘文件发送数据?
% cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 58
model name : Intel(R) Core(TM) i7-3537U CPU @ 2.00GHz
stepping : 9
microcode : 0x21
cpu MHz : 1286.233
cache size : 4096 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm cpuid_fault epb pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms xsaveopt dtherm ida arat pln pts md_clear flush_l1d
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips : 4988.39
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
% sudo smartctl -a /dev/sda
smartctl 6.6 2017-11-05 r4594 [x86_64-linux-4.19.0-6-amd64] (local build)
Copyright (C) 2002-17, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Family: Toshiba 2.5" HDD MQ01ABD...
Device Model: TOSHIBA MQ01ABD075
Serial Number: 33BWT0STT
LU WWN Device Id: 5 000039 4a1f83658
Firmware Version: AX0R2J
User Capacity: 750,156,374,016 bytes [750 GB]
Sector Sizes: 512 bytes logical, 4096 bytes physical
Rotation Rate: 5400 rpm
Form Factor: 2.5 inches
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS (minor revision not indicated)
SATA Version is: SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Sun Jan 26 23:16:14 2020 WET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
% lspci -tv
-[0000:00]-+-00.0 Intel Corporation 3rd Gen Core processor DRAM Controller
+-01.0-[01]----00.0 NVIDIA Corporation GK107M [GeForce GT 740M]
+-02.0 Intel Corporation 3rd Gen Core processor Graphics Controller
+-04.0 Intel Corporation 3rd Gen Core Processor Thermal Subsystem
+-14.0 Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller
+-16.0 Intel Corporation 7 Series/C216 Chipset Family MEI Controller #1
+-1a.0 Intel Corporation 7 Series/C216 Chipset Family USB Enhanced Host Controller #2
+-1b.0 Intel Corporation 7 Series/C216 Chipset Family High Definition Audio Controller
+-1c.0-[02]--
+-1c.1-[03]----00.0 Qualcomm Atheros AR9485 Wireless Network Adapter
+-1c.3-[04]--+-00.0 Realtek Semiconductor Co., Ltd. RTL8411 PCI Express Card Reader
| \-00.2 Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
+-1d.0 Intel Corporation 7 Series/C216 Chipset Family USB Enhanced Host Controller #1
+-1f.0 Intel Corporation HM76 Express Chipset LPC Controller
+-1f.2 Intel Corporation 7 Series Chipset Family 4-port SATA Controller [IDE mode]
+-1f.3 Intel Corporation 7 Series/C216 Chipset Family SMBus Controller
\-1f.5 Intel Corporation 7 Series Chipset Family 2-port SATA Controller [IDE mode]
我一直在研究如何从最后一行可能没有尾随换行符的文件中正确读取行。在Read a line-oriented file which may not end with a newline中找到了答案。
但是,我有第二个目标是排除行首的注释,并找到了grep
实现目标的命令
$ grep -v '^ *#' file
但是我注意到这个命令有一个(对我来说出乎意料的)副作用:如果它不存在,它会在最后一行添加一个尾随换行符
$ cat file
# This is a commentary
aaaaaa
# This is another commentary
bbbbbb
cccccc
$ od -c file
0000000 # T h i s i s a c o m m
0000020 e n t a r y \n a a a a a a \n #
0000040 T h i s i s a n o t h e r
0000060 c o m m e n t a r y \n b b b b b
0000100 b \n c c c c c c \n
0000111
$ truncate -s -1 file
$ od -c file
0000000 # T h i s i s a c o m m
0000020 e n t a r y \n a a a a a a \n #
0000040 T h i s i s a n o t h e r
0000060 c o m m e n t a r y \n b b b b b
0000100 b \n c c c c c c
0000110
$ od -c <(grep -v '^ *#' file)
0000000 a a a a a a \n b b b b b b \n c c
0000020 c c c c \n
0000025
请注意,除了删除行开头的注释外,它还在最后一行添加了尾随换行符。
怎么可能?
0
给定一个由s 和s组成的字符串1
,我的目标是将 0 替换为 1,反之亦然。例子:
输入
111111100000000000000
预期输出
000000011111111111111
我尝试了以下sed
命令,但未成功
echo '111111100000000000000' | sed -e 's/0/1/g ; s/1/0/g'
000000000000000000000
我错过了什么?
存在其中注释在井号和实际注释之间有空格的 shell 脚本
# a comment at the beginning of a line
echo foo # a comment trailing after a command
和其他没有的
#another comment at the beginning of a line
echo bar #another comment trailing after a command
这个决定是否会对脚本的实际执行产生某种影响,还是(只是)一个编码风格问题?
在这个问题Get line number from character position我知道可以在文本文件中使用脚本从字符位置获取行号。
Emacs 具有M-x-goto-char
将光标定位在字符位置的功能。
我的问题是:是否有任何 UNIX 实用程序可以以优雅的方式完成工作?
给定以下目录结构:
$ tree --noreport dir
dir
├── fileA
├── .hiddenfileA
├── .hiddendirA
| ├── .hiddenfileB
│ ├── fileC
│ └── fileD
└── dirA
├── .hiddenfileC
├── fileE
└── fileF
要求是调用 find 以便从结果中排除来自隐藏目录但不是隐藏文件(在非隐藏目录下)的文件。
预期回报应该类似于:
./.hiddenfileA
./dirA/.hiddenfileC
./dirA/fileE
./dirA/fileF
./fileA
做了一些研究并在这里找到了导致我创建以下调用的信息find
$ find . -type f -not -path '*/\.*' -print
但是这个解决方案的缺点是跳过了隐藏的目录和文件。