while loop read命令是打印位置而不仅仅是文件名 - 为什么会这样?

时间:2016-07-27 13:36:32

标签: linux bash while-loop

有人可以向我解释为什么当我在下面的脚本中打印$ file_name变量时,它是否显示位置而不仅仅是文件名?这并不一定是坏事,因为我正在努力尝试分别打印位置,md5sum和文件名,但我现在很困惑为什么要打印这个位置。

这是文本文件:

day19-pgm-am_0946-23_p1_13.mov
day19-pgm-am_0951-23_p1_14.mov
day19-pgm-am_1016-23_p1_19.mov
day19-pgm-am_1021-23_p1_20.mov
day19-pgm-am_1111-23_p1_30.mov

#!/bin/bash


file=/location/md5sum.txt


while IFS=, read -ra arr; do
    while IFS= read -r -d '' file_name; do
        md5=($(md5sum "$file_name"))
        printf '%s\n' "$file_name $md5"
    done < <(find . -name "${arr[0]}" -print0)
done<"$file"

这是当前输出,您可以看到数据显示文件的相关位置:

./level1/level2/day19-pgm-am_0946-23_p1_13.mov d41d8cd98f00b204e9800998ecf8427e
./level1/day19-pgm-am_0946-23_p1_13.mov d41d8cd98f00b204e9800998ecf8427e
./level1/level2/day19-pgm-am_0951-23_p1_14.mov d41d8cd98f00b204e9800998ecf8427e
./level1/day19-pgm-am_0951-23_p1_14.mov d41d8cd98f00b204e9800998ecf8427e
./level1/level2/day19-pgm-am_1016-23_p1_19.mov d41d8cd98f00b204e9800998ecf8427e
./level1/day19-pgm-am_1016-23_p1_19.mov d41d8cd98f00b204e9800998ecf8427e
./level1/level2/day19-pgm-am_1021-23_p1_20.mov d41d8cd98f00b204e9800998ecf8427e
./level1/day19-pgm-am_1021-23_p1_20.mov d41d8cd98f00b204e9800998ecf8427e
./level1/level2/day19-pgm-am_1111-23_p1_30.mov d41d8cd98f00b204e9800998ecf8427e
./level1/day19-pgm-am_1111-23_p1_30.mov d41d8cd98f00b204e9800998ecf8427e

3 个答案:

答案 0 :(得分:2)

你从find获得的

$file_name是从find提供的目录中找到的文件的相对路径。

您可以像这样获取目录和文件名:

directory=`dirname $file_name`
just_filename=`basename $file_name`

打印这些。

答案 1 :(得分:0)

试试这个;

#!/bin/bash

file=/location/md5sum.txt


while IFS=, read -ra arr; do
    while IFS= read -r -d '' file_name; do
        md5=($(md5sum "$file_name"))
        printf '%s\n' "$(basename $file_name) $md5"
    done < <(find . -name "${arr[0]}" -print0)
done<"$file"

答案 2 :(得分:0)

您还可以使用string operators

printf '%s\n' "${file_name##*/} $md5"

这会将所有内容都删除到最后/