如何仅列出文件名并删除目录和子目录

如何仅列出文件名并删除目录和子目录

如何使用 find、sed、awk、cut 或任何命令获取仅文件名的列表并删除目录和子目录。

例如:我使用 find 获取所有媒体文件的列表:

find /var/warehouse/* -type f \( -name "*.avi" -o -name "*.mkv" -o -name "*.flv" -o -name "*.mp4" \) -exec ls {} +

输出:

/var/warehouse/movies/Blade/The.Bucket.List[2007]DvDrip-aXXo.avi
/var/warehouse/movies/Blade/The Lion King (1994).mkv
/var/warehouse/movies/Blade/The.Pursuit.of.Happyness.2006.DVD5.720p.BluRay.x264-REVEiLLE.en.mkv
/var/warehouse/movies/Blade/The Secret [Dual Audio] Upscaled 720p Ripped by FÅM€.mkv
/var/warehouse/movies/Blade/Yes.Man.2008.DvDRip-FxM.avi
/var/warehouse/movies/Bollywood/Bhaag Milkha Bhaag - DVDScr - XviD - 1CDRip - [DDR].avi

我想要的输出为:

The.Bucket.List[2007]DvDrip-aXXo.avi
The Lion King (1994).mkv
The.Pursuit.of.Happyness.2006.DVD5.720p.BluRay.x264-REVEiLLE.en.mkv
The Secret [Dual Audio] Upscaled 720p Ripped by FÅM€.mkv
Yes.Man.2008.DvDRip-FxM.avi
Bhaag Milkha Bhaag - DVDScr - XviD - 1CDRip - [DDR].avi

答案1

你已经拥有了大部分。你只需要把你的-exec改为-printf

find /var/warehouse/* -type f \( -name "*.avi" -o -name "*.mkv" -o -name "*.flv" -o -name "*.mp4" \) -printf "%f\n"

%f将打印找到的文件的名称,忽略它的路径。

您可能还需要考虑将您的-nameto更改为-iname(不区分大小写的匹配),以便它也匹配*.Avi*.AVI等文件。

答案2

POSIXly:

find /var/warehouse/* -type f \( -name "*.avi" -o -name "*.mkv" \
    -o -name "*.flv" \
    -o -name "*.mp4" \) \
    -exec basename {} \;

或者你可以find结合sed

find /var/warehouse/* -type f \( -name "*.avi" -o -name "*.mkv" \
    -o -name "*.flv" \
    -o -name "*.mp4" \) | sed -e 's!.*/!!'

相关内容