我有一个带有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移动到它。
答案 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命令。