2020-05-26

ffmeg02

 
1. 查看视频信息
2. 截取一段视频
3. 提高音量
4. 去除水印
5. 批量处理
 5.1 使用sh脚本批量去除片头固定时长片段
 5.2 同时处理片头,片尾的
6. 合并
7. ffmpeg -help


本文主要记录 使用ffmpeg 处理视频文件 (去除 片头广告)
关于字幕的可参照:https://szosoft.blogspot.com/2019/11/ffmpeg-01-subtitle.html
或者这里:https://www.cnblogs.com/sztom/p/11964797.html

1. 查看视频信息

$ ffmpeg -i lamp.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'lamp.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:11:21.81, start: 0.000000, bitrate: 1637 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1504 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
At least one output file must be specified

2. 截取一段视频

先看表示时间的选项
  • -ss time_off set the start time offset 设置开始时间偏移
  • -t duration record or transcode "duration" seconds of audio/video 记录或转码音频/视频的“持续时间”秒
  • -to time_stop record or transcode stop time 记录或转码停止时间
注: -to(时间格式) 和 -t(秒数) 选项都是表述持续时间,只是格式不同而已.

截取开始到7分30秒的视频, 就是去除7分30秒后的所有内容.
$ ffmpeg -ss 00:00:00 -i lamp.mp4 -to 00:07:30 o730.mp4
这样的标准写法, 速度会有点慢.

快速去掉第一秒
$ ffmpeg -ss 00:00:01 -i o730-15.mp4 -c copy 0730-16.mp4
参考帮助信息
  • -c codec codec name 编解码器名称
  • -vcodec codec force video codec ('copy' to copy stream) 强制视频编解码器(“复制”以复制流)
  • -acodec codec force audio codec ('copy' to copy stream) 强制音频编解码器(“复制”以复制流)
  • -scodec codec force subtitle codec ('copy' to copy stream) 强制字幕编解码器(“复制”以复制流)
增加了 -c copy 直接复制. 参照上面帮助信息, 也可以分开来写 -vcodec copy -acodec copy.

(也有后面这样的写法: -c:v copy -c:a copy 但这种写法之对部分文件有效, 对于美剧原始文件(包含更多的元数据,流数据)会报错.)
快速剪裁视频前100秒, 这种写法对于国内翻译网站编辑过的文件有效.
$ ffmpeg -ss 00:00:00 -i Devs.mp4 -t 100 -c:v copy -c:a copy Deus.mp4

3. 提高音量

-vol volume change audio volume (256=normal) 更改音量(256 =正常)
参考以上帮助信息, 提高音量, 大于256即可. 具体多少合适, 要自己尝试了.
$ ffmpeg -ss 00:00:00 -i Devs.mp4 -vol 1024 Devs2.mp4
当有几个文件想要一起循环播放,但不同的文件音量差异很大时,这个就很有用了.

4. 去除水印

-vf filter_graph set video filters 设置视频过滤器
查看相关可用滤镜
$ ffmpeg -filters |grep logo
 T.. delogo            V->V       Remove logo from input video.
 T.. removelogo        V->V       Remove a TV logo based on a mask image.

去掉指定坐标位置的静态水印
$ ffmpeg -i Devs.mp4 -vf "delogo=x=1:y=1:w=100:h=30:show=0" Deus.103.mp4
#-vf  "delogo=x=1:y=1:w=100:h=30:show=0" 滤镜位置以视频左上角为(1,1)坐标; 大小:宽100,高30; show=0 无边框, show=1 会有绿色边框.

5. 批量处理

5.1 使用sh脚本批量去除片头固定时长片段

找到ffmpeg命令文件的位置
$ whereis ffmpeg
ffmpeg: /usr/bin/ffmpeg /usr/share/ffmpeg /usr/share/man/man1/ffmpeg.1.gz

$ which ffmpeg
/usr/bin/ffmpeg

进入视频文件夹, 保存如下脚本到 ffmpeg-45.sh 文件,
#!/bin/bash
#用 for 循环直接获取当前目录下的 mp4文件循环处理,去掉开头45 秒
for i in *.mp4 ; do
    /usr/bin/ffmpeg -ss 00:00:45 -i $i -c copy /home/mov/$i -y
done
执行, 大约复制一遍视频文件的时间就完成了. 看看结果,没问题,就可以删除原文件了.
$ bash ffmpeg-45.sh

5.2 同时处理片头,片尾的

参考这里: https://blog.csdn.net/wchenjt/article/details/105759542
#!/bin/bash
#我这里要切除的开头和结尾都是 7 秒
beg=7
end=7

#用 for 循环直接获取当前目录下的 mp4、mp3、avi 等文件循环处理,单个文件可以去掉 for 循环
for i in (*.mp4,*.mp3,*.avi ); do
 #将元数据信息临时保存到 tmp.log 文件中
    nohup /usr/local/ffmpeg/bin/ffmpeg -i "$i" > tmp.log
    #获取视频的时长,格式为  00:00:10,10 (时:分:秒,微妙)
    time="`cat /usr/local/ffmpeg/tmp.log |grep Duration: |awk  '{print $2}'|awk -F "," '{print $1}'|xargs`"
    echo $time
    #求视频的总时长,先分别求出小时、分、秒的值,这里不处理微秒,可以忽略
    hour="`echo $time |awk -F ":" '{print $1}' `"
    min="`echo $time |awk -F ":" '{print $2}' `"
    sec="`echo $time |awk -F ":" '{print $3}'|awk -F "." '{print $1}' `"
    #echo $hour $min $sec
    num1=`expr $hour \* 3600`
    num2=`expr $min \* 60`
    num3=$sec
    #计算出视频的总时长(秒)
    sum=`expr $num1 + $num2 + $num3`  
    
    #总时长减去开头和结尾就是截取后的视频时长,并且这里不需要再转回 hour:min:sec 的格式,直接使用结果即可
    newtime=`expr $sum - $beg - $end`
    echo $newtime
    /usr/local/ffmpeg/bin/ffmpeg -ss 00:00:07 -i $i -t $newtime -c:v copy -c:a copy /data/tmp/$i -y
done

6. 合并

-f fmt force format 强制格式
1. 建立list.txt 文件,参照如下记录要合并的视频文件列表
file ./d1.mp4
file ./d2.mp4
file ./d3.mp4
2. 合并
$ ffmpeg -f concat -safe 0 -i list.txt -c copy con.mp4

或者用如下一条语句,需要bash
$ ffmpeg -f concat -safe 0 -i <(for f in /mnt/sa10/mv/*.mp4; do echo "file '$f'"; done) -c copy output.mp4

$ ffmpeg -f concat -safe 0 -i <(for f in /mnt/sa10/TDDownload/LinuxDownload/ffmpeg/c/*.mp4; do echo "file '$f'"; done) -c copy output.mp4
选的3个相同格式的文件,且都很小,所以瞬间完成了,不过报了一堆黄色字符信息, 不过没有错误或警告的关键字.
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x561923876f40] Auto-inserting h264_mp4toannexb bitstream filter
Input #0, concat, from '/dev/fd/63':
  Duration: N/A, start: -0.021333, bitrate: 777 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 648 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s
    Metadata:
      handler_name    : SoundHandler
Output #0, mp4, to 'output.mp4':
  Metadata:
    encoder         : Lavf58.29.100
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, q=2-31, 648 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 24k tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s
    Metadata:
      handler_name    : SoundHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x56192387cc40] Auto-inserting h264_mp4toannexb bitstream filter
[mp4 @ 0x56192388e780] Non-monotonous DTS in output stream 0:0; previous: 239751, current: 100626; changing to 239752. This may result in incorrect timestamps in the output file.
...
[mp4 @ 0x56192388e780] Non-monotonous DTS in output stream 0:0; previous: 239890, current: 239765; changing to 239891. This may result in incorrect timestamps in the output file.
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x56192387a540] Auto-inserting h264_mp4toannexb bitstream filter
[mp4 @ 0x56192388e780] Non-monotonous DTS in output stream 0:0; previous: 626151, current: 601136; changing to 626152. This may result in incorrect timestamps in the output file.
...
[mp4 @ 0x56192388e780] Non-monotonous DTS in output stream 0:0; previous: 626176, current: 626161; changing to 626177. This may result in incorrect timestamps in the output file.
frame= 1319 fps=0.0 q=-1.0 Lsize=    7318kB time=00:00:48.03 bitrate=1248.2kbits/s speed= 168x    
video:6593kB audio:693kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.451475%

7. ffmpeg -help


Print help / information / capabilities:打印帮助/信息/功能:|wc -l
-Lshow license演出许可证
-h-- print basic options-打印基本选项110
-h long-- print more options -打印更多选项222
-h full-- print all options (including all format and codec specific options, very long)
11352
-h type=name– print all options for the named decoder/encoder/demuxer/muxer/filter/bsf

-versionshow version显示版本
-buildconfshow build configuration显示构建配置47
-formatsshow available formats显示可用格式361
-muxersshow available muxers 复用器(mux)把不同的流按照某种容器的规则放入容器172
-demuxersshow available demuxers 解复用(demux)把不同的流从某种容器中解析出来311
-devicesshow available devices 设备显示可用设备16
-codecsshow available codecs 编解码器(Codec)是对视频进行压缩或者解压缩463
-decodersshow available decoders 解码器显示可用的解码器477
-encodersshow available encoders 编码器显示可用的编码器199
-bsfsshow available bit stream filters显示可用的比特流过滤器35
-protocolsshow available protocols显示可用的协议64
-filtersshow available filters 滤镜显示可用的过滤器395
-pix_fmtsshow available pixel formats显示可用的像素格式201
-layoutsshow standard channel layouts显示标准频道布局58
-sample_fmtsshow available audio sample formats显示可用的音频样本格式13
-colorsshow available color names显示可用的颜色名称141
-sources devicelist sources of the input device列出输入设备的来源
-sinks devicelist sinks of the output device列出输出设备的接收器
-hwaccelsshow available HW acceleration methods显示可用的硬件加速方法


Global options (affect whole program instead of just one file:全局选项(影响整个程序,而不仅仅是一个文件:
-loglevel loglevelset logging level设置日志记录级别
-v loglevelset logging level设置日志记录级别
-reportgenerate a report生成报告
-max_alloc bytesset maximum size of a single allocated block设置单个分配块的最大大小
-yoverwrite output files覆盖输出文件
-nnever overwrite output files永远不会覆盖输出文件
-ignore_unknownIgnore unknown stream types忽略未知的流类型
-filter_threadsnumber of non-complex filter threads非复杂过滤器线程数
-filter_complex_threadsnumber of threads for -filter_complex-filter_complex的线程数
-statsprint progress report during encoding编码过程中的打印进度报告
-max_error_rate maximum error rateratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.错误率 (0.0: no errors, 1.0: 100% errors), ffmpeg高于该比率将返回错误而不是成功。
-bits_per_raw_samplenumber set the number of bits per raw sample数字设置每个原始样本的位数
-vol volumechange audio volume (256=normal)更改音量(256 =正常)

Advanced global options:高级全局选项:
-cpuflags flagsforce specific cpu flags强制特定的cpu标志
-hide_banner hide_bannerdo not show program banner不显示程序横幅
-copy_unknownCopy unknown stream types复制未知的流类型
-benchmarkadd timings for benchmarking添加基准测试时间
-benchmark_alladd timings for each task为每个任务添加时间
-progress urlwrite program-readable progress information编写程序可读的进度信息
-stdinenable or disable interaction on standard input在标准输入上启用或禁用交互
-timelimit limitset max runtime in seconds以秒为单位设置最大运行时间
-dumpdump each input packet转储每个输入数据包
-hexwhen dumping packets, also dump the payload转储数据包时,也转储有效负载
-vsyncvideo sync method视频同步方式
-frame_drop_thresholdframe drop threshold丢帧阈值
-asyncaudio sync method音频同步方式
-adrift_threshold thresholdaudio drift threshold音频漂移阈值
-copytscopy timestamps复制时间戳记
-start_at_zeroshift input timestamps to start at 0 when using copyts使用copyts时,将输入时间戳转换为从0开始
-copytb modecopy input stream time base when stream copying流复制时复制输入流的时基
-dts_delta_threshold thresholdtimestamp discontinuity delta threshold时间戳不连续性增量阈值
-dts_error_threshold thresholdtimestamp error delta threshold时间戳错误增量阈值
-xerror errorexit on error错误退出
-abort_on flagsabort on the specified condition flags在指定的条件标志上中止
-filter_complex graph_descriptioncreate a complex filtergraph创建一个复杂的filtergraph
-lavfi graph_descriptioncreate a complex filtergraph创建一个复杂的filtergraph
-filter_complex_script filenameread complex filtergraph description from a file从文件中读取复杂的filtergraph描述
-debug_tsprint timestamp debugging info打印时间戳调试信息
-intradeprecated use -g 1不推荐使用-g 1
-sameqRemoved已移除
-same_quantRemoved已移除
-deinterlacethis option is deprecated, use the yadif filter instead不建议使用此选项,请改用yadif过滤器
-psnrcalculate PSNR of compressed frames计算压缩帧的PSNR
-vstatsdump video coding statistics to file将视频编码统计信息转储到文件
-vstats_file filedump video coding statistics to file将视频编码统计信息转储到文件
-vstats_versionVersion of the vstats format to use.要使用的vstats格式的版本。
-qphistshow QP histogram显示QP直方图
-vc channeldeprecated, use -channel不推荐使用,使用-channel
-tvstd standarddeprecated, use -standard不推荐使用,使用-standard
-isyncthis option is deprecated and does nothing此选项已弃用,不执行任何操作
-sdp_file filespecify a file in which to print sdp information指定要在其中打印sdp信息的文件
-vaapi_device deviceset VAAPI hardware device (DRM path or X11 display name)设置VAAPI硬件设备(DRM路径或X11显示名称)
-init_hw_device argsinitialise hardware device初始化硬件设备
-filter_hw_device deviceset hardware device used when filtering设置过滤时使用的硬件设备


Per-file main options:每个文件的主要选项:
-f fmtforce format强制格式
-c codeccodec name编解码器名称
-codec codeccodec name编解码器名称
-pre presetpreset name预设名称
-map_metadata outfile[,metadata]:infile[,metadata]set metadata information of outfile from infile设置infile中outfile的元数据信息
-t durationrecord or transcode "duration" seconds of audio/video记录或转码音频/视频的“持续时间”秒
-to time_stoprecord or transcode stop time记录或转码停止时间
-fs limit_sizeset the limit file size in bytes设置限制文件大小(以字节为单位)
-ss time_offset the start time offset设置开始时间偏移
-sseof time_offset the start time offset relative to EOF设置相对于EOF的开始时间偏移
-seek_timestampenable/disable seeking by timestamp with -ss使用-ss按时间戳启用/禁用查找
-timestamp timeset the recording timestamp ('now' to set the current time)设置录制时间戳(“现在”设置当前时间)
-metadata string=stringadd metadata添加元数据
-program title=string:st=number...add program with specified streams添加具有指定流的程序
-target typespecify target file type ("vcd", "svcd", "dvd", "dv" or "dv50" with optional prefixes "pal-", "ntsc-" or "film-")指定目标文件类型 ("vcd", "svcd", "dvd", "dv" or "dv50" with optional prefixes "pal-", "ntsc-" or "film-")
-apadaudio pad音垫
-frames numberset the number of frames to output设置要输出的帧数
-filter filter_graphset stream filtergraph设置流filtergraph
-filter_script filenameread stream filtergraph description from a file从文件中读取流filtergraph描述
-reinit_filterreinit filtergraph on input parameter changes输入参数更改时重新初始化filtergraph
-discarddiscard丢弃
-dispositiondisposition部署

Advanced per-file options:每个文件的高级选项:
-map [-]input_file_id[:stream_specifier][,sync_file_id[:stream_sset input stream mapping设置输入流映射
-map_channel file.stream.channel[:syncfile.syncstream]map an audio channel from one stream to another将音频通道从一个流映射到另一个
-map_chapters input_file_indexset chapters mapping设置章节映射
-accurate_seekenable/disable accurate seeking with -ss使用-ss启用/禁用精确搜索
-itsoffset time_offset the input ts offset设置输入ts的偏移量
-itsscale scaleset the input ts scale设置输入ts比例
-dframes numberset the number of data frames to output设置要输出的数据帧数
-reread input at native frame rate以原始帧速率读取输入
-shortestfinish encoding within shortest input在最短的输入内完成编码
-bitexactbitexact mode位精确模式
-copyinkfcopy initial non-keyframes复制初始非关键帧
-copypriorsscopy or discard frames before start time在开始时间之前复制或丢弃帧
-tag fourcc/tagforce codec tag/fourcc强制编解码器标签/ fourcc
-q quse fixed quality scale (VBR)使用固定质量量表(VBR)
-qscale quse fixed quality scale (VBR)使用固定质量量表(VBR)
-profile profileset profile设定个人资料
-attach filenameadd an attachment to the output file将附件添加到输出文件
-dump_attachment filenameextract an attachment into a file将附件提取到文件中
-stream_loop loop countset number of times input stream shall be looped设置输入流应循环的次数
-thread_queue_sizeset the maximum number of queued packets from the demuxer设置来自多路分解器的排队数据包的最大数量
-find_stream_inforead and decode the streams to fill missing information with heuristics读取和解码流以使用启发式方法填充丢失的信息
-autorotateautomatically insert correct rotate filters自动插入正确的旋转滤镜
-muxdelay secondsset the maximum demux-decode delay设置最大多路分解解码延迟
-muxpreload secondsset the initial demux-decode delay设置初始多路分配解码延迟
-time_base ratioset the desired time base hint for output stream (1:24, 1:48000 or 0.04166, 2.0833e-5)设置输出流的所需时基提示 (1:24, 1:48000 or 0.04166, 2.0833e-5)
-enc_time_base ratioset the desired time base for the encoder (1:24, 1:48000 or 0.04166, 2.0833e-5). two special values are defined - 0 = use frame rate (video) or sample rate (audio),-1 = match source time base设置编码器所需的时基(1:24, 1:48000 or 0.04166, 2.0833e-5). 定义了两个特殊值-0 =使用帧率(视频)或采样率(音频),-1 =匹配源时基
-bsf bitstream_filtersA comma-separated list of bitstream filters以逗号分隔的位流过滤器列表
-fpre filenameset options from indicated preset file从指示的预设文件设置选项
-max_muxing_queue_size packetsmaximum number of packets that can be buffered while waiting for all streams to initialize等待所有流初始化时可以缓冲的最大数据包数
-dcodec codecforce data codec ('copy' to copy stream)强制数据编解码器(“复制”以复制流)


Video options:视频选项:
-vframes numberset the number of video frames to output设置要输出的视频帧数
-r rateset frame rate (Hz value, fraction or abbreviation)设置帧频(Hz值,分数或缩写)
-s sizeset frame size (WxH or abbreviation)设置帧大小(WxH或缩写)
-aspect aspectset aspect ratio (4:3, 16:9 or 1.3333, 1.7777)设置纵横比(4:3、16:9或1.3333、1.7777)
-bits_per_raw_samplenumber set the number of bits per raw sample数字设置每个原始样本的位数
-vndisable video禁用视频
-vcodec codecforce video codec ('copy' to copy stream)强制视频编解码器(“复制”以复制流)
-timecode hh:mm:ss[:;.]ffset initial TimeCode value.设置初始TimeCode值。
-pass nselect the pass number (1 to 3)选择通行证编号(1至3)
-vf filter_graphset video filters设置视频过滤器
-ab bitrateaudio bitrate (please use -b:a)音频比特率(请使用-b:a)
-b bitratevideo bitrate (please use -b:v)视频比特率(请使用-b:v)
-dndisable data禁用数据

Advanced Video options:进阶影片选项:
-pix_fmt formatset pixel format设置像素格式
-intradeprecated use -g 1不推荐使用-g 1
-rc_override overriderate control override for specific intervals特定时间间隔的速率控制优先
-sameqRemoved已移除
-same_quantRemoved已移除
-passlogfile prefixselect two pass log file name prefix选择两个通过日志文件名的前缀
-deinterlacethis option is deprecated, use the yadif filter instead不建议使用此选项,请改用yadif过滤器
-psnrcalculate PSNR of compressed frames计算压缩帧的PSNR
-vstatsdump video coding statistics to file将视频编码统计信息转储到文件
-vstats_file filedump video coding statistics to file将视频编码统计信息转储到文件
-vstats_versionVersion of the vstats format to use.要使用的vstats格式的版本。
-intra_matrix matrixspecify intra matrix coeffs指定内部矩阵系数
-inter_matrix matrixspecify inter matrix coeffs指定矩阵间系数
-chroma_intra_matrix matrixspecify intra matrix coeffs指定内部矩阵系数
-toptop=1/bottom=0/auto=-1 field firsttop = 1 / bottom = 0 / auto = -1首先
-vtag fourcc/tagforce video tag/fourcc强制视频标签/ fourcc
-qphistshow QP histogram显示QP直方图
-force_fpsforce the selected framerate, disable the best supported framerate selection强制选定帧率,禁用最佳支持的帧率选择
-streamid streamIndex:valueset the value of an outfile streamid设置输出文件流ID的值
-force_key_frames timestampsforce key frames at specified timestamps在指定的时间戳上强制关键帧
-hwaccel hwaccel nameuse HW accelerated decoding使用硬件加速解码
-hwaccel_device devicenameselect a device for HW acceleration选择用于硬件加速的设备
-hwaccel_output_format formatselect output format used with HW accelerated decoding选择用于硬件加速解码的输出格式
-vc channeldeprecated, use -channel不推荐使用,使用-channel
-tvstd standarddeprecated, use -standard不推荐使用,使用-standard
-vbsf video bitstream_filtersdeprecated不推荐使用
-vpre presetset the video options to the indicated preset将视频选项设置为指示的预设

Audio options:音频选项:
-aframes numberset the number of audio frames to output设置要输出的音频帧数
-aq qualityset audio quality (codec-specific)设置音频质量(特定于编解码器)
-ar rateset audio sampling rate (in Hz)设置音频采样率(以Hz为单位)
-ac channelsset number of audio channels设置音频通道数
-andisable audio禁用音频
-acodec codecforce audio codec ('copy' to copy stream)强制音频编解码器(“复制”以复制流)
-vol volumechange audio volume (256=normal)更改音量(256 =正常)
-af filter_graphset audio filters设置音频过滤器

Advanced Audio options:高级音频选项:
-atag fourcc/tagforce audio tag/fourcc强制音频标签/ fourcc
-sample_fmt formatset sample format设置样本格式
-channel_layout layoutset channel layout设置频道布局
-guess_layout_maxset the maximum number of channels to try to guess the channel layout设置最大通道数以尝试猜测通道布局
-absf audio bitstream_filtersdeprecated不推荐使用
-apre presetset the audio options to the indicated preset将音频选项设置为指示的预设

Subtitle options:字幕选项:
-s sizeset frame size (WxH or abbreviation)设置帧大小(WxH或缩写)
-sndisable subtitle禁用字幕
-scodec codecforce subtitle codec ('copy' to copy stream)强制字幕编解码器(“复制”以复制流)
-stag fourcc/tagforce subtitle tag/fourcc强制字幕标签/ fourcc
-fix_sub_durationfix subtitles duration修正字幕的持续时间
-canvas_size sizeset canvas size (WxH or abbreviation)设置画布大小(WxH或缩写)
-spre presetset the subtitle options to the indicated preset将字幕选项设置为指示的预设

2020-05-25

df-V-du

1. 使用du -sm查看本机主要目录大小
2. df VS du
3. df与du的help对比
 3.1 df与du相同或相似选项
 3.2 因针对目标不同,df与du差异选项

1. 使用du -sm查看本机主要目录大小

/… s2 du -sh 备注
boot 2 120M boot
etc 4 25M 配置文件
root 13 13M root
usr 19 6.3G usr
var 20 2.2G var
bin -> usr/bin 1 链接
lib -> usr/lib 6 链接
lib64 -> usr/lib 7 链接
sbin -> usr/bin 15 链接
home 5 5.7G 用户磁盘
mnt 9 挂载点
dev 3 0 内存数据
proc 11 内存数据
sys 17 0 内存数据
run 14 988k 内存数据
lost+found 8 16k
opt 10 4k 附加应用
repo 12 4k
srv 16 12k 服务
tmp 18 8k 临时目录
/usr/… du -sm 备注
bin/ 470 命令
include/ 318 头文件
lib/ 3614 库文件
lib32/ 6
lib64 -> lib/
local/ 1
sbin -> bin/
share/ 2103 帮助...
src/ 1
/var/… du -sm 备注
cache/ 1899 Pkg
db/ 1
empty/ 1
games/ 1
lib/ 121
local/ 1
lock -> ../run/lock/ 1
log/ 170 日志
mail -> spool/mail/ 1
opt/ 1
run -> ../run/ 1
spool/ 1
tmp/ 1
.updated 1

2. df VS du

项目 \ 命令 $ df [OPTION]... [FILE]... $ du [OPTION]... [FILE]…
名称 disk free disk usage
描述 查看(文件系统)的磁盘空间占用情况 查看(文件和目录)的磁盘使用情况
针对 文件系统 文件和目录
系统调用 statfs fstat
目标 整个分区 递归,累加文件
文件非常多时,运行速度 不受文件数量影响 会很慢
当前存在文件占用空间 包含 包含
已经删除但还没被释放的空间 包含 不包含
记录自身的 (i节点,磁盘分布图,间接块,超级块)等对大多数用户级程序是不可见的元数据 Meta Data 包含 不包含
获取 /tmp 文件系统的块数 # df /tmp
… Used 52 …
# du -s /tmp
44 /tmp
小结 会考虑元数据, 并包含已删除还未释放的部分.
体现当前实际占用情况.
用户级程序, 只考虑现有文件,
获得的数值篇小.
相关相似的命令有 lsblk, blkid, fdisk -l ls, tree

3. df与du的help对比

3.1 df与du相同或相似选项

$ df --help Usage: df [OPTION]... [FILE]... $ du --help Usage: du [OPTION]... [FILE]…
or: du [OPTION]... --files0-from=F
显示有关文件系统或默认情况下所有文件系统的信息。 说明 递归地汇总文件或目录集的磁盘使用情况。
Mandatory arguments to long options are mandatory for short options too. = 长选项的强制性参数对于短选项也是必需的。
-a, --all include pseudo, duplicate, inaccessible file systems
包括伪,重复,不可访问的文件系统
相似 -a, --all write counts for all files, not just directories
写所有文件的计数,而不仅仅是目录
-B, --block-size=SIZE scale sizes by SIZE before printing them;
e.g., '-BM' prints sizes in units of 1,048,576 bytes; see SIZE format below
= -B, --block-size=SIZE 在打印之前按SIZE缩放尺寸;
例如,“-BM”以1,048,576字节为单位打印尺寸;请参阅下面的SIZE格式
-h, --human-readable print sizes in human readable format
(e.g., 1K 234M 2G)
= -h, --human-readable 以人类可读的格式打印尺寸
(例如1K 234M 2G)
-H, --si like -h, but use powers of 1000 not 1024 = --si 类似于-h,但使用1000的幂而不是1024
-i, --inodes list inode usage information instead of block usage = --inodes 列出索引节点使用情况信息,而不是块使用情况
-k like --block-size=1K = -k 像--block-size = 1K
--help display this help and exit = --help 显示此帮助并退出
--version output version information and exit = --version 输出版本信息并退出
Display values are in units of the first available SIZE from --block-size, and the DF_BLOCK_SIZE, BLOCK_SIZE and BLOCKSIZE environment variables.
Otherwise, units default to 1024 bytes (or 512 if POSIXLY_CORRECT is set).
~ Display values are in units of the first available SIZE from --block-size, and the DU_BLOCK_SIZE, BLOCK_SIZE and BLOCKSIZE environment variables.
Otherwise, units default to 1024 bytes (or 512 if POSIXLY_CORRECT is set).
The SIZE argument is an integer and optional unit (example: 10K is 10*1024).
Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
Binary prefixes can be used, too: KiB=K, MiB=M, and so on.
= The SIZE argument is an integer and optional unit (example: 10K is 10*1024).
Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
Binary prefixes can be used, too: KiB=K, MiB=M, and so on.
GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Full documentation <https://www.gnu.org/software/coreutils/df>
or available locally via: info '(coreutils) df invocation'
~ GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Full documentation <https://www.gnu.org/software/coreutils/du>
or available locally via: info '(coreutils) du invocation'
FIELD_LIST is a comma-separated list of columns to be included. Valid field names are:
'source', 'fstype', 'itotal', 'iused', 'iavail', 'ipcent', 'size', 'used', 'avail', 'pcent', 'file' and 'target' (see info page).

3.2 因针对目标不同,df与du差异选项

$ df --help Usage: df [OPTION]... [FILE]... cn
-l, --local limit listing to local file systems 将列表限制为本地文件系统
--sync invoke sync before getting usage info 在获取使用情况信息之前调用同步
--no-sync do not invoke sync before getting usage info (default) 在获取使用情况信息之前不调用同步(默认)
--output[=FIELD_LIST] use the output format defined by FIELD_LIST, or print all fields if FIELD_LIST is omitted. 使用FIELD_LIST定义的输出格式,如果省略FIELD_LIST,则打印所有字段。
-P, --portability use the POSIX output format 使用POSIX输出格式
--total elide all entries insignificant to available space, and produce a grand total 排除所有与可用空间无关紧要的条目,并产生总计
-T, --print-type print file system type 打印文件系统类型
-t, --type=TYPE limit listing to file systems of type TYPE 将列表限制为TYPE类型的文件系统
-x, --exclude-type=TYPE limit listing to file systems not of type TYPE 将列表限制为非TYPE类型的文件系统
-v (ignored) (忽略)
$ du --help Usage: du [OPTION]... [FILE]… or: du [OPTION]... --files0-from=F
-b, --bytes equivalent to '--apparent-size --block-size=1' 等效于'--apparent-size --block-size = 1'
--apparent-size print apparent sizes, rather than disk usage; although the apparent size is usually smaller, it may be larger due to holes in ('sparse') files, internal fragmentation, indirect blocks, and the like 打印外观大小,而不是磁盘使用情况;尽管表观大小通常较小,但由于(“稀疏”)文件中的漏洞,内部碎片,间接块等,它可能会更大
-X, --exclude-from=FILE exclude files that match any pattern in FILE 排除与FILE中任何模式匹配的文件
--exclude=PATTERN exclude files that match PATTERN 排除与PATTERN匹配的文件
-x, --one-file-system skip directories on different file systems 跳过不同文件系统上的目录
-0, --null end each output line with NUL, not newline 用NUL而不是换行符结束每个输出行
-c, --total produce a grand total 产生总计
-s, --summarize display only a total for each argument 每个参数仅显示总计
-S, --separate-dirs for directories do not include size of subdirectories 对于目录,不包括子目录的大小
-D, --dereference-args dereference only symlinks that are listed on the command line 仅取消引用命令行上列出的符号链接
-L, --dereference dereference all symbolic links 取消引用所有符号链接
-P, --no-dereference don't follow any symbolic links (this is the default) 不要遵循任何符号链接(这是默认设置)
-H equivalent to --dereference-args (-D) 等效于--dereference-args(-D)
-l, --count-links count sizes many times if hard linked 如果硬链接,则多次计算大小
-d, --max-depth=N print the total for a directory (or file, with --all) only if it is N or fewer levels below the command line argument; --max-depth=0 is the same as --summarize 仅当目录(或文件,带有--all)的级别低于命令行参数N或更少级别时,才显示该目录的总和; --max-depth = 0与--summarize相同
--files0-from=F summarize disk usage of the NUL-terminated file names specified in file F; if F is -, then read names from standard input 总结文件F中指定的NUL终止文件名的磁盘使用情况;如果F为-,则从标准输入中读取名称
-t, --threshold=SIZE exclude entries smaller than SIZE if positive, or entries greater than SIZE if negative 如果为正则排除小于SIZE的条目,如果为负则排除大于SIZE的条目
--time show time of the last modification of any file in the directory, or any of its subdirectories 显示目录或其任何子目录中任何文件的最后修改时间
--time=WORD show time as WORD instead of modification time: atime, access, use, ctime or status 将时间显示为WORD而不是修改时间:atime,access,use,ctime或status
--time-style=STYLE show times using STYLE, which can be: full-iso, long-iso, iso, or +FORMAT; FORMAT is interpreted like in 'date' 使用STYLE显示时间,可以是:完全等距,长时间等距,iso或+ FORMAT;格式的解释类似于“日期”

2020-05-15

Arch-pacman-Tips-And-Tricks


0. 参考原文
1. 查询
 1.1 pacman -Q 选项(查询已安装的包,多个过滤器)
 1.2 pacman -F 选项(文件数据库查询)
 1.3 Pactree 树状显示依赖项
 1.4 pacreport列出未拥有的文件
 1.5 /etc/pacreport.conf
 1.6 pac*
 1.7 paclog查看日至
2. 进阶查询语句(个别不支持fish,请在bash下运行)
 2.1 列出所有已安装的软件包及其各自的大小
 2.2 要列出明确安装的软件包(不在base元软件包或组 base-devel中),包含大小和说明: 
 2.3 要列出几个软件包的下载大小(packages留空以列出所有软件包): 
 2.4 列出标记为升级的软件包及其下载大小 
 2.5 使用expac列出最后安装的20个软件包,请运行: 
 2.6 明确安装的但不在base元软件包的软件: 
 2.7 列出不在base 元软件包或base-devel 软件包组中的显式安装的软件包: 
 2.8 列出所有其他软件包不需要的安装软件包,这些软件包不在基本 meta软件包或base-devel软件包组中: 
 2.9 列出所有不在指定存储库repo_name中的已安装软件包 
 2.a 列出repo_name存储库中的所有已安装软件包: 
 2.b 列出Arch Linux ISO上所有不在base元软件包中的软件包: 
 2.c 列出开发包(不稳定包)
 2.d 浏览包(互动:左边列表,右边描述)
 2.e 识别任何软件包都不拥有的文件
 2.f 获取几个软件包的依赖项列表
 2.g 列出更改的备份文件
3. pacman进阶选项
 3.1 几个可以双写的选项[谨慎使用]
 3.2 安装原因[避免使用]
 3.3 指定文件安装[避免使用]
4. 删除
 4.1 卸载已安装软件
 4.2 清理缓存的安装包文件
 4.3 删除未使用的软件包(孤立的)
 4.4 除去必要软件包以外的所有软件
 4.5 重新安装所有软件包
 4.6 列出软件包中所有更改的文件
5. [避免使用]某些pacman命令
6. 包装安全Pacman-key

0. 参考原文

pacman: https://wiki.archlinux.org/index.php/Pacman
pacman 提示和技巧: https://wiki.archlinux.org/index.php/Pacman/Tips_and_tricks
Arch Linux 系统维护: https://wiki.archlinux.org/index.php/System_maintenance
pacman-key: https://wiki.archlinux.org/index.php/Pacman-key
https://wiki.archlinux.org/index.php/Pacman/Package_signing

1. 查询

1.1 pacman -Q 选项(查询已安装的包,多个过滤器)

$ pacman -Q [filter] 选项描述 中文翻译
-d, --deps list packages installed as dependencies [filter] 列出安装为依赖项的软件包[过滤器]
-e, --explicit list packages explicitly installed [filter] 列出明确安装的软件包[过滤器]
-m, --foreign list installed packages not found in sync db(s) [filter] 列出已安装的非官方库软件包
-n, --native list installed packages only found in sync db(s) [filter] 列出已安装的官方库软件包
-t, --unrequired list packages not (optionally) required by any package
(-tt to ignore optdepends) [filter]
列出任何软件包都不要求(可选)的软件包
(-tt忽略optdepends)[过滤器]
-u, --upgrades list outdated packages [filter] 列出过期的软件包[过滤器]
-o, --owns <file> query the package that owns <file> 查询拥有<file>的软件包

$ pacman -Qm   列出已安装的非官方库软件包(通常是手动下载并安装或包裹从仓库取出)

1.2 pacman -F 选项(文件数据库查询)

搜索包含特定文件的软件包
同步文件数据库:
$ sudo pacman -Fy
搜索包含文件的软件包,例如:
$ sudo pacman -F iw
core/iw 5.4-1 [installed]
    usr/bin/iw
或者:
$ sudo pacman -Qo iw
/usr/bin/iw is owned by iw 5.4-1

列出查询包所拥有的文件
$ sudo pacman -Fl iw
iw usr/
iw usr/bin/
iw usr/bin/iw
iw usr/share/
iw usr/share/man/
iw usr/share/man/man8/
iw usr/share/man/man8/iw.8.gz
或者:
$ sudo pacman -Ql iw
iw /usr/
iw /usr/bin/
iw /usr/bin/iw
iw /usr/share/
iw /usr/share/man/
iw /usr/share/man/man8/
iw /usr/share/man/man8/iw.8.gz

1.3 Pactree 树状显示依赖项

要查看程序包的依赖关系树:
$ pactree iw
iw
└─libnl
  └─glibc
    ├─linux-api-headers provides linux-api-headers>=4.10
    ├─tzdata
    └─filesystem
      └─iana-etc
反向查看
$ pactree -r iw
iw
这个结果表示没有任何其他软件依赖iw,若不需要,可以直接删除.也就是pacman -Qt选项能够查到的内容.

$ pacman -F pactree
community/pacman-contrib 1.3.0-2 [installed]
    usr/bin/pactree
$ pacman -Qo pactree
/usr/bin/pactree is owned by pacman-contrib 1.3.0-2

找到pactree来自pacman-contrib, 再看看这个包里还有什么?
$ pacman -Fl pacman-contrib
$ pacman -Ql pacman-contrib |grep bin
pacman-contrib /usr/bin/checkupdates
pacman-contrib /usr/bin/paccache
pacman-contrib /usr/bin/pacdiff
pacman-contrib /usr/bin/paclist
pacman-contrib /usr/bin/paclog-pkglist
pacman-contrib /usr/bin/pacscripts
pacman-contrib /usr/bin/pacsearch
pacman-contrib /usr/bin/pacsort
pacman-contrib /usr/bin/pactree
pacman-contrib /usr/bin/rankmirrors
pacman-contrib /usr/bin/updpkgsums

1.4 pacreport列出未拥有的文件

$ sudo pacreport --unowned-files
  /etc/.pwd.lock
  /etc/.updated
...
  /var/spool/cups/c00027
  /var/spool/cups/tmp/.cache/
Unneeded Packages Installed Explicitly:
...
  xfdesktop                           2.43 M (xfce4)
  xfwm4-themes                        3.53 M (xfce4)
  xorg-server                         4.30 M (xorg)
  youtube-dl                         12.59 M
  zip                               558.12 K
Unneeded Packages Installed As Dependencies:
Installed Packages Not In A Repository:
Missing Group Packages:
Package Cache Size:

$ sudo pacreport --unowned-files |wc -l
373

如下, pacreport属于pacutils
$ pacman -Qo pacreport
/usr/bin/pacreport is owned by pacutils 0.9.0-1
$ pacman -F pacreport
community/pacutils 0.9.0-1 [installed]
    usr/bin/pacreport

列出这个包里的其他命令
$ pacman -Fl pacutils |wc -l
53
$ pacman -Ql pacutils |grep bin
pacutils usr/bin/paccapability
pacutils usr/bin/paccheck
pacutils usr/bin/pacconf
pacutils usr/bin/pacfile
pacutils usr/bin/pacinfo
pacutils usr/bin/pacini
pacutils usr/bin/pacinstall
pacutils usr/bin/paclock
pacutils usr/bin/paclog
pacutils usr/bin/pacremove
pacutils usr/bin/pacrepairdb
pacutils usr/bin/pacrepairfile
pacutils usr/bin/pacreport
pacutils usr/bin/pacsift
pacutils usr/bin/pacsync
pacutils usr/bin/pactrans

1.5 /etc/pacreport.conf

跟踪软件包创建的未拥有文件
大多数系统会在正常操作过程中缓慢收集一些ghost文件,例如状态文件,日志,索引等。
http://ftp.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html#S3-RPM-INSIDE-FLIST-GHOST-DIRECTIVE
从pacutils包的pacreport命令可用于通过跟踪这些文件及其关联/etc/pacreport.conf(参见pacreport(1) )。
https://wiki.archlinux.org/index.php/Pacman/Tips_and_tricks#Tracking_unowned_files_created_by_packages
https://jlk.fjfi.cvut.cz/arch/manpages/man/pacreport.1#FILES

INI样式的配置文件列出了与--unowned-files一起运行时要忽略的路径。
  • 可以在“[Options]”部分中使用“ IgnoreUnowned”指定应始终忽略的路径。
  • 可以在“[PkgIgnoreUnowned]”部分列出仅在安装了特定软件包的情况下才应忽略的路径,使用软件包名称作为选项名称,并忽略路径作为值。
  • 可以多次指定所有选项。路径可能包括外壳样式的glob。安装根目录不应包含在路径中。
/etc/pacreport.conf
 [Options]
 IgnoreUnowned = home/*
 IgnoreUnowned = proc/*
 IgnoreUnowned = mnt/*

 [PkgIgnoreUnowned]
 grub = boot/grub/*
 linux = boot/initramfs-linux-fallback.img
 linux = boot/initramfs-linux.img
 linux = boot/vmlinuz-linux
 pacman = var/lib/pacman/local
 pacman = var/lib/pacman/sync

1.6 pac*

Pkg /bin/pac… des cn
pacman pacman Package manager utility 包管理器实用程序
pacman-conf Query pacman's configuration file 查询pacman的配置文件
pacman-db-upgrade Executable, Upgrade the local pacman database to a newer format 可执行,将本地pacman数据库升级为较新的格式
pacman-key Manage pacman's list of trusted keys 管理pacman的受信任密钥列表
pacman-contrib paccache Flexible pacman cache cleaning utility 灵活的pacman缓存清理实用程序
pacdiff Pacorig, pacnew and pacsave maintenance utility Pacorig,pacnew和pacsave维护实用程序
paclist Executable, List all packages installed from a given repository 可执行,列出从给定存储库安装的所有软件包
paclog-pkglist Executable, Parse a log file into a list of currently installed packages 可执行,将日志文件解析为当前已安装软件包的列表
pacscripts Executable, Prints the {pre,post}_{install,remove,upgrade} scripts of a given package. 可执行,打印给定软件包的{pre,post}_{install,remove,upgrade}脚本。
pacsearch Executable, Perform a pacman search using both the local and the sync databases. 可执行,同时使用本地和同步数据库执行pacman搜索
pacsort Sort utility implementing alpm_pkg_vercmp 排序工具,实现alpm_pkg_vercmp
pactree Package dependency tree viewer 包依赖关系树查看器
pacmatic pacmatic PACMATIC performs a bunch of mundane tasks that you must do before every invocation of Pacman... PACMATIC执行一堆平凡的任务,您必须在每次调用Pacman之前执行这些任务。
pacutils paccapability Query libalpm capabilities 查询libalpm功能
paccheck Check installed packages 检查已安装的软件包
pacconf Query pacman's configuration file 查询pacman的配置文件
pacfile Display information about package files 显示有关软件包文件的信息
pacinfo Display package information 显示包装信息
pacini Query pacman-style configuration files 查询pacman风格的配置文件
pacinstall Install/remove alpm packages 安装/删除alpm软件包
paclock Executable, lock/unlock the alpm database 可执行,锁定/解锁alpm数据库
paclog Filter pacman log entries 过滤pacman日志条目
pacremove Install/remove alpm packages 安装/删除alpm软件包
pacrepairdb Fix corrupted database entries 修复损坏的数据库条目
pacrepairfile Reset properties on alpm-managed files 重置Alpm托管文件的属性
pacreport Display a summary of installed packages 显示已安装软件包的摘要
pacsift Query and filter packages 查询和过滤包
pacsync Update sync databases 更新同步数据库
pactrans Install/remove alpm packages 安装/删除alpm软件包

$ paclist core |wc -l
172
$ paclist extra |wc -l
508
$ paclist community |wc -l
96

1.7 paclog查看日至

$ cat /var/log/pacman.log
$ sudo journalctl -r |grep pacman |more
$ paclog --help
paclog - filter pacman log entries
usage: paclog [options] [filters]
options:

--config=<path> set an alternate configuration file 设置备用配置文件
--root=<path> set an alternate installation root 设置备用安装根目录
--sysroot=<path> set an alternate installation system root 设置备用安装系统根目录
--debug enable extra debugging messages 启用额外的调试消息
--logfile=<path> set an alternate log file 设置备用日志文件
--[no-]color color output 颜色输出
--pkglist list installed packages (EXPERIMENTAL) 列出已安装的软件包(EXPERIMENTAL)
filters:

--action=<action> show <action> entries 显示<action>条目
install, reinstall, upgrade, downgrade, remove, all.
--after=<date> show entries after <date> 在<date>之后显示条目
--before=<date> show entries before <date> 显示<date>之前的条目
--caller=<name> show entries from program <name> 显示程序<名称>中的条目
--commandline show command line entries 显示命令行条目
--grep=<regex> show entries matching <regex> 显示与<regex>匹配的条目
--package=<pkg> show entries affecting <pkg> 显示影响<pkg>的条目
--warnings show notes/warnings/errors 显示笔记/警告/错误

2. 进阶查询语句(个别不支持fish,请在bash下运行)

2.1 列出所有已安装的软件包及其各自的大小

$ LC_ALL=C pacman -Qi | awk '/^Name/{name=$3} /^Installed Size/{print $4$5, name}' | sort -h
...
110.65MiB gimp
117.18MiB linux-headers
139.32MiB gcc
149.57MiB gcc-libs
162.18MiB virtualbox
187.05MiB firefox
187.96MiB chromium
294.43MiB noto-fonts-cjk
383.93MiB libreoffice-fresh
516.18MiB linux-firmware

2.2 要列出明确安装的软件包(不在base元软件包或组 base-devel中),包含大小和说明:

$ expac -H M "%011m\t%-20n\t%10d" $(comm -23 <(pacman -Qqen | sort) <({ pacman -Qqg base-devel; expac -l '\n' '%E' base; } | sort | uniq)) | sort -n
  56.01 MiB    gramps                  Genealogy program, which helps you track your family tree
  56.44 MiB    perl                    A highly capable, feature-rich programming language
  57.98 MiB    adobe-source-han-sans-cn-fonts    Adobe Source Han Sans Subset OTF - Simplified Chinese OpenType/CFF fonts
  58.65 MiB    vlc                     Multi-platform MPEG, VCD/DVD, and DivX player
  74.60 MiB    linux                   The Linux kernel and modules
  83.83 MiB    mesa                    An open-source implementation of the OpenGL specification
 110.65 MiB    gimp                    GNU Image Manipulation Program
 117.18 MiB    linux-headers           Headers and scripts for building modules for the Linux kernel
 149.57 MiB    gcc-libs                Runtime libraries shipped by GCC
 162.18 MiB    virtualbox              Powerful x86 virtualization for enterprise as well as home use
 187.05 MiB    firefox                 Standalone web browser from mozilla.org
 187.96 MiB    chromium                A web browser built for speed, simplicity, and security
 294.43 MiB    noto-fonts-cjk          Google Noto CJK fonts
 383.93 MiB    libreoffice-fresh       LibreOffice branch which contains new features and program enhancements
 516.18 MiB    linux-firmware          Firmware files for Linux

$ expac -H M "%011m\t%-20n\t%10d" $(comm -23 <(pacman -Qqen | sort) <({ pacman -Qqg base-devel; expac -l '\n' '%E' base; } | sort | uniq)) | sort -n |wc -l
212
$ pacman -Qe |wc -l
234

2.3 要列出几个软件包的下载大小(packages留空以列出所有软件包):

$ expac -S -H M '%k\t%n' |wc -l
10619
$ expac -S -H M '%k\t%n' chromium
57.81 MiB    chromium

2.4 列出标记为升级的软件包及其下载大小

$ expac -S -H M '%k\t%n' $(pacman -Qqu) | sort -sh |wc -l
10619

2.5 使用expac列出最后安装的20个软件包,请运行:

$ expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort | tail -n 5
2020-05-12 05:39:46    intel-ucode
2020-05-12 05:39:46    libcddb
2020-05-12 05:39:46    sysstat
2020-05-12 05:39:46    xf86-video-intel
2020-05-12 21:57:18    tree

2.6 明确安装的但不在base元软件包的软件:

$ comm -23 <(pacman -Qqe | sort) <(expac -l '\n' '%E' base | sort) |wc -l
234
$ pacman -Qqe |wc -l
234

2.7 列出不在base 元软件包或base-devel 软件包组中的显式安装的软件包:

$ comm -23 <(pacman -Qqe | sort) <({ pacman -Qqg base-devel; expac -l '\n' '%E' base; } | sort -u) |wc -l
212

2.8 列出所有其他软件包不需要的安装软件包,这些软件包不在基本 meta软件包或base-devel软件包组中:

$ comm -23 <(pacman -Qqt | sort) <({ pacman -Qqg base-devel; expac -l '\n' '%E' base; } | sort -u) |wc -l
134
pacman -Qt |wc -l
139

如上, 但显示描述
$ expac -H M '%-20n\t%10d' $(comm -23 <(pacman -Qqt | sort) <({ pacman -Qqg base-devel; expac -l '\n' '%E' base; } | sort -u))
...
xfdesktop               A desktop manager for Xfce
xfwm4-themes            A set of additional themes for the Xfce window manager
xorg-server             Xorg X server
youtube-dl              A small command-line program to download videos from YouTube.com and a few more sites

$ expac -H M '%-20n\t%10d' $(comm -23 <(pacman -Qqt | sort) <({ pacman -Qqg base-devel; expac -l '\n' '%E' base; } | sort -u)) |wc -l
134

2.9 列出所有不在指定存储库repo_name中的已安装软件包

comm -23 <(pacman -Qq | sort) <(pacman -Sql repo_name | sort)
$ comm -23 <(pacman -Qq | sort) <(pacman -Sql core | sort) |wc -l
605
$ comm -23 <(pacman -Qq | sort) <(pacman -Sql extra | sort) |wc -l
268
$ comm -23 <(pacman -Qq | sort) <(pacman -Sql community | sort) |wc -l
681

2.a 列出repo_name存储库中的所有已安装软件包:

comm -12 <(pacman -Qq | sort) <(pacman -Sql repo_name | sort)
$ comm -12 <(pacman -Qq | sort) <(pacman -Sql core | sort) |wc -l
172
$ comm -12 <(pacman -Qq | sort) <(pacman -Sql extra | sort) |wc -l
509
$ comm -12 <(pacman -Qq | sort) <(pacman -Sql community | sort) |wc -l
96
 == or ==
$ paclist core |wc -l
172
$ paclist extra |wc -l
508
$ paclist community |wc -l
96

2.b 列出Arch Linux ISO上所有不在base元软件包中的软件包:

$ comm -23 <(curl https://git.archlinux.org/archiso.git/plain/configs/releng/packages.x86_64) <(expac -l '\n' '%E' base | sort)
wget
wireless-regdb
wireless_tools
wpa_supplicant
wvdial
xfsprogs
xl2tpd

$ comm -23 <(curl https://git.archlinux.org/archiso.git/plain/configs/releng/packages.x86_64) <(expac -l '\n' '%E' base | sort) |wc -l
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   712  100   712    0     0    838      0 --:--:-- --:--:-- --:--:--   837
80

2.c 列出开发包(不稳定包)

$ pacman -Qq | grep -Ee '-(bzr|cvs|darcs|git|hg|svn)$'

2.d 浏览包(互动:左边列表,右边描述)

$ pacman -Qq | fzf --preview 'pacman -Qil {}' --layout=reverse --bind 'enter:execute(pacman -Qil {} | less)'
需要安装fzf, 输入字母以过滤软件包列表;使用箭头键(或Ctrl-j/ Ctrl-k)进行导航;按Enter下看到包的信息较少。

如果您发现一个特定的程序包package占用了大量空间,并且想找出哪些文件占了大部分,那么这一程序可能会派上用场。
pacman -Qlq package | grep -v '/$' | xargs du -h | sort -h
$ pacman -Qlq iw | grep -v '/$' | xargs du -h | sort -h
4.0K    /usr/share/man/man8/iw.8.gz
260K    /usr/bin/iw

2.e 识别任何软件包都不拥有的文件

列出所有感兴趣的文件,并对照pacman检查它们:
提示:该lostfiles脚本执行类似的步骤,而且还包括一个广泛的黑名单从输出除去共同误报。
# find /etc /usr /opt /var | LC_ALL=C pacman -Qqo - 2>&1 > /dev/null | cut -d ' ' -f 5-
...
# find /etc /usr /opt /var | LC_ALL=C pacman -Qqo - 2>&1 > /dev/null | cut -d ' ' -f 5- |wc -l
13256

2.f 获取几个软件包的依赖项列表

注意:要仅显示本地已安装软件包的树,请使用pacman -Qi。
$ LC_ALL=C pacman -Si packages | awk -F'[:<=>]' '/^Depends/ {print $2}' | xargs -n1 | sort -u
或者,使用expac:
$ expac -l '\n' %E -S packages | sort -u

$ C_ALL=C pacman -Si iw | awk -F'[:<=>]' '/^Depends/ {print $2}' | xargs -n1 | sort -u
libnl

$ C_ALL=C pacman -Qi iw | awk -F'[:<=>]' '/^Depends/ {print $2}' | xargs -n1 | sort -u
libnl
$ pactree iw
iw
└─libnl
  └─glibc
    ├─linux-api-headers provides linux-api-headers>=4.10
    ├─tzdata
    └─filesystem
      └─iana-etc

2.g 列出更改的备份文件

如果要备份系统配置文件,可以复制所有文件,/etc/但是通常您只对已更改的文件感兴趣。可以使用以下命令查看修改后的备份文件:
以root用户权限运行此命令将确保/etc/sudoers输出中包括仅root用户可读的文件(例如)。
$ sudo pacman -Qii | awk '/^MODIFIED/ {print $2}'
/etc/cups/printers.conf
/etc/fstab
/etc/group
/etc/gshadow
/etc/hosts
/etc/passwd
/etc/resolv.conf
/etc/shadow
/etc/shells
/etc/security/limits.d/10-gcr.conf
/etc/locale.gen
/etc/default/grub
/etc/iptables/iptables.rules
/etc/mkinitcpio.conf
/etc/nftables.conf
/etc/pacman.conf
/etc/pacman.d/mirrorlist
/etc/privoxy/config
/etc/sudoers
/etc/systemd/logind.conf
/etc/UPower/UPower.conf
/etc/v2ray/config.json

3. pacman进阶选项

3.1 几个可以双写的选项[谨慎使用]

- 选项 选项描述 中文翻译
-S -c, --clean remove old packages from cache directory (-cc for all) 从缓存目录中删除旧软件包(-cc删除全部)
----RS-U -d, --nodeps skip dependency version checks (-dd to skip all checks) 跳过依赖性版本检查(-dd跳过所有检查)
---Q-S-- -i, --info view package information (-ii for backup files) 查看软件包信息(-ii表示备份文件)
-D-Q---- -k, --check test local database for validity (-kk for sync databases) 测试本地数据库的有效性(-kk用于同步数据库)
-R -s, --recursive remove unnecessary dependencies
(-ss includes explicitly installed dependencies)
删除不必要的依赖项
(-ss包括显式安装的依赖项)
-Q -t, --unrequired list packages not (optionally) required by any package
(-tt to ignore optdepends) [filter]
列出任何软件包都不要求(可选)的软件包
(-tt忽略optdepends)[过滤器]
-S -u, --sysupgrade upgrade installed packages (-uu enables downgrades) 升级已安装的软件包(-uu启用降级)
--F--S-- -y, --refresh download fresh package databases from the server
(-yy to force a refresh even if up to date)
从服务器下载新的软件包数据库
(-yy,即使是最新也要强制刷新)

3.2 安装原因[避免使用]

- 选项 选项描述 中文翻译
-D---S-U --asdeps mark packages as non-explicitly installed 将软件包标记为非明确安装
-D---S-U --asexplicit mark packages as explicitly installed 将软件包标记为明确安装

#pacman -D –asdeps
#pacman -S –asdeps
#pacman -U –asdeps

可能会被作为孤儿程序卸载
在重新安装软件包时,默认情况下会保留当前的安装原因。

3.3 指定文件安装[避免使用]

# pacman -Sw    下载软件包而不安装它:
# pacman -U /path/…pkg.tar.xz     安装不是来自远程存储库的“本地”软件包(例如,该软件包来自AUR):
# pacman -U file:///path/…pkg.tar.xz     要将本地软件包的副本保留在pacman的缓存中,请使用:
# pacman -U http://…/…pkg.tar.xz     安装“远程”软件包(不是从pacman的配置文件中所述的存储库中获取):

 -S, 官方库下载安装;
 -U, 指定pkg.tar.xz软件包安装;
 -R, 卸载;
  均可使用( -p, --print)选项打印目标而不是执行操作

4. 删除

4.1 卸载已安装软件

卸载软件包 s3
#pacman -R 删除单个软件包,保留所有依赖项的安装
#pacman -Rs 删除任何其他已安装软件包都不需要的软件包及其依赖项
#pacman -Rsu 当删除包含其他需要的软件包的组时,(-Rs)有时可能会拒绝运行。请尝试(-Rsu)
#pacman -Rsc 要删除软件包,其依赖项以及所有依赖于目标软件包的软件包:
警告:此操作是递归的,因此必须小心使用,因为它会删除许多可能需要的软件包。
#pacman -Rdd 要删除另一个软件包所需的软件包,而不删除从属软件包:
警告:以下操作可能会破坏系统,应避免。请参阅系统维护#避免使用某些pacman命令。
https://wiki.archlinux.org/index.php/System_maintenance#Avoid_certain_pacman_commands
#pacman -Rn 删除某些应用程序时,Pacman保存重要的配置文件,并以扩展名.pacsave命名。
为防止创建这些备份文件,请使用以下-n选项:

4.2 清理缓存的安装包文件

清理程序包缓存 Pacman将下载的软件包存储在其中/var/cache/pacman/pkg/,并且不会自动删除旧版本或已卸载的版本。方便重新安装
#paccache -r 删除旧的软件包(包含已安装和已卸载), 保留最新的3个版本
#paccache -rk1 删除旧的软件包(包含已安装和已卸载), 保留最新的1个版本
#paccache -ruk0 删除所有已卸载软件包的缓存版本
#pacman -Sc 要删除所有当前未安装的缓存软件包以及未使用的同步数据库
#pacman -Scc 要从缓存中删除所有文件,请使用两次清洁开关,这是最激进的方法,不会在缓存文件夹中保留任何内容:
警告:除非一个人迫切需要释放一些磁盘空间,否则应避免从高速缓存中删除所有以前版本的已安装软件包和所有未卸载软件包。这将防止降级或重新安装软件包,而无需再次下载它们。

4.3 删除未使用的软件包(孤立的)

$ sudo pacman -Qqdt | sudo pacman -Rs -
error: argument '-' specified with empty stdin
  == or ==
$ sudo pacman -Rns $(pacman -Qtdq)
error: no targets specified (use -h for help)

4.4 除去必要软件包以外的所有软件

如果有必要删除除基本软件包以外的所有软件包,一种方法是将非必需软件包的安装原因设置为依赖关系,然后删除所有不必要的依赖关系。
首先,对于“按显式”安装的所有软件包,将其安装原因更改为“作为依赖项”:
# pacman -D --asdeps $(pacman -Qqe)
然后,安装原因更改为“为明确”只有基本的包,那些你不希望删除,以避免针对他们:
# pacman -D --asexplicit base linux linux-firmware
可以将其他软件包添加到上述命令中,以避免被删除。有关功能完整的基本系统可能需要的其他软件包的更多信息,请参见安装指南#Install基本软件包。
https://wiki.archlinux.org/index.php/Installation_guide#Install_essential_packages
这还将选择要删除的引导加载程序的软件包。该系统仍应可引导,但是没有它,引导参数可能无法更改。
最后,按照#删除未使用的程序包(孤立)中的说明,删除所有安装原因为“依赖”的程序包。

4.5 重新安装所有软件包

# pacman -Qqn | pacman -S -

4.6 列出软件包中所有更改的文件

如果您怀疑文件损坏(例如,由于软件/硬件故障),但是不确定文件是否损坏,则可能要与软件包中的哈希值进行比较。这可以通过pacutils完成:
# paccheck --md5sum --quiet

5. [避免使用]某些pacman命令

https://wiki.archlinux.org/index.php/System_maintenance#Avoid_certain_pacman_commands
- 避免进行部分升级。换句话说,永不运行pacman -Sy;相反,请始终使用pacman -Syu
- 避免使用(--overwrite)选项。该选项接受包含glob的参数, 会绕过与glob匹配的文件的文件冲突检查。仅应在Arch开发人员明确建议的情况下使用。
- 避免使用(-d, --nodeps)选项。pacman -Rdd 在软件包卸载过程中会跳过依赖性检查。结果,可能会删除提供严重依赖性的程序包,从而导致系统损坏。

6. 包装安全Pacman-key

Pacman支持软件包签名,这可以为软件包增加额外的安全性。默认配置SigLevel = Required DatabaseOptional启用全局级别的所有软件包的签名验证:每个存储库SigLevel行都可以覆盖此签名。有关包签名和签名验证的更多详细信息,请参阅pacman-key。
https://wiki.archlinux.org/index.php/Pacman-key
https://wiki.archlinux.org/index.php/Pacman/Package_signing

刷新密钥
$ pacman-key --refresh-keys

重置所有密钥
如果要删除或重置系统中安装的所有密钥,则可以以root用户身份删除文件夹/etc/pacman.d/gnupg并重新运行,pacman-key --init然后pacman-key --populate archlinux重新添加默认密钥。
$ pacman-key --init
$ pacman-key --populate archlinux

Diode

导航 (返回顶部) 1. Diode 1.1 Diode 概述 1.2 肖克利二极管方程 1.3 缩写 Abbreviations 2. 主要功能 2.1 单向电流 (Unidirectional current flow) 2.2 阈值电压 (Threshold...