将.txt中的文件名列表传递给查找和复制命令

时间:2014-10-10 19:53:09

标签: linux bash find sh cp

我有一个带有xml文件名列表的.txt文件。 我需要获取每个xml文件并将其与我目录中其他位置的同名图像配对。

我已经使用sed从文件名中清除.xml

Text File Example:
 DF_0001.jpg.xml
 DF_0002.jpg.xml

 After 'sed' cleaning:
 DF_0001.jpg
 DF_0002.jpg

 Source File and Path Example:
 path/to/drive/1/DF0001.jpg
 path/to/drive/2/DF0002.jpg

我的.txt文件包含xml文件列表。这是实际的xml文件的位置:

 /Sites/csv/file_list.txt
 /Sites/csv/DF_0001.jpg.xml
 /Sites/csv/DF_0002.jpg.xml

我的图像文件(同名)存在于任意数量的目录中:

 /Images/JPG/Day1/DF_0001.jpg
 /Images/JPG/Day1/DF_0002.jpg
 /Images/JPG/Day1/DF_0003.jpg
 /Images/JPG/Day2/DF0004.jpg
 /Images/JPG/Day2/DF0005.jpg

简单地说: 我需要从txt文件中找到一个.jpg文件,然后将相应的xml移动到它。

2 个答案:

答案 0 :(得分:1)

sed 's/\.xml//' /Sites/csv/file_list.xml > /tmp/your_jpg_files.txt
find /Images/JPG -type f -name "*.jpg" | grep -F -f /tmp/your_jpg_files.txt |
while read FILEPATH; do
    mv "/Sites/csv/${FILEPATH##*/}.xml" "${FILEPATH%/*}"
done

说明:

sed 's/\.xml//' /Sites/csv/file_list.xml > /tmp/your_jpg_files.txt

从file_list.xml中读取文件名,删除后缀.xml并将结果保存在临时文件中。


find /Images/JPG -type f -name "*.jpg"

列出自目录/ Images / JPG

以来.jpg文件的所有路径
grep --fixed-strings --file=/tmp/your_jpg_files.txt

在路径列表中,您可以查看jpg文件


while read FILEPATH; do
    mv "/Sites/csv/${FILEPATH##*/}.xml" "${FILEPATH%/*}"
done

在此步骤中,您拥有.jpg文件的所有路径,对于其中任何一个,您将获得所需的 mv

${FILEPATH##*/} = $(basename "$FILEPATH")但效率更高。
${FILEPATH%/*} = $(dirname "$FILEPATH")但效率更高。


实施例

FILEPATH包含/Images/JPG/Day2/DF0005.jpg,因此实际的mv将为:

# /Sites/csv/${FILEPATH##*/}.xml -> /Sites/csv/DF0005.jpg.xml
# ${FILEPATH%/*} -> /Images/JPG/Day2/
mv "/Sites/csv/DF0005.jpg.xml" "/Images/JPG/Day2/"

答案 1 :(得分:1)

以下是基于这样的假设,即文件名和路径名中都没有空格,并且xml文件名存储在名为"xmls"的文件中(处理路径/文件名中的空格可能很简单但是确定它很乏味。

find . -type f -name '*.jpg' | while read a ; do 
    printf '%s ' `dirname "$a"`
    basename "$a"
done > jpegs
awk 'NR == FNR {tmp=$0;sub(".xml$","");xml[$0]=tmp;next}
    {if(xml[$2]) {print "cp ", xml[$2], $1 }}' xmls jpegs

第一个命令查找当前和更深层目录中的所有jpeg,您可以轻松更改它,然后将路径名提供给管道,该管道将路径与文件名分开,第二个命令读取"xmls" file用于构建由jpegs名称索引的xml名称数组,然后处理另一个文件,如果匹配则打印shell命令。