Linux 如何从上述列表中获取文件名

Linux 如何从上述列表中获取文件名,linux,bash,filenames,Linux,Bash,Filenames,我不熟悉linux和/或脚本,请耐心听我说。我想要一个脚本,可以得到一个Linux目录的文件。这里是我为获取文件名所做的尝试 用于名称,单位为$ls-1*.wav/some/path | cut-d/-f3 | cut-d--f1-5 如果文件名包含-IN或-OUT,那么它们将是sox-m,之后是另一个目录的mv,但是如果文件名包含其他一些文件,那么它们将只是mv 作为参考,文件名如下 1030-04-06-2015-143414216.wav 1030-04-06-2015-143414318

我不熟悉linux和/或脚本,请耐心听我说。我想要一个脚本,可以得到一个Linux目录的文件。这里是我为获取文件名所做的尝试

用于名称,单位为$ls-1*.wav/some/path | cut-d/-f3 | cut-d--f1-5

如果文件名包含-IN或-OUT,那么它们将是sox-m,之后是另一个目录的mv,但是如果文件名包含其他一些文件,那么它们将只是mv

作为参考,文件名如下

1030-04-06-2015-143414216.wav 1030-04-06-2015-143414318.wav 1030-04-06-2015-1433414440.wav 1043-21-05-2015-1432207256.wav 1043-21-05-2015-1432207457.wav 1046-20-05-2015-143237944.wav 1046-20-05-2015-143138015.wav 1046-20-05-2015-143238704.wav 1431709157.93900.0-in.wav 1431709157.93900.0-out.wav 1431709157.93900.1-in.wav 1431709157.93900.1-out.wav 143171008.94059.0-in.wav 143171008.94059.0-out.wav 143171008.94059.1-in.wav 143171008.94059.1-out.wav 143171008.94059.1.wav 143171008.94059.2.wav 1431713190.94698.2-in.wav 1431713190.94698.2-out.wav 1431713190.94698.2.wav 1431721107.96010.0-in.wav 1431721107.96010.0-out.wav 1431721107.96010.1.wav


这里有一种方法

>cat test.sh
#!/bin/bash

destination="./DEST"

# Loop over every file
for file in "${@}" ; do
  # If it is "-in", then sox
  if [[ "${file}" =~ "-in" ]] || [[ "${file}" =~ "-out" ]] ; then
    printf "sox -m ${file}; "
  fi
  echo "mv ${file} ${destination}"
done
运行时,我得到以下输出

>../test.sh *
mv 1030-04-06-2015-1433414216.wav ./DEST
mv 1030-04-06-2015-1433414318.wav ./DEST
mv 1030-04-06-2015-1433414440.wav ./DEST
mv 1043-21-05-2015-1432207256.wav ./DEST
mv 1043-21-05-2015-1432207457.wav ./DEST
mv 1046-20-05-2015-1432137944.wav ./DEST
mv 1046-20-05-2015-1432138015.wav ./DEST
mv 1046-20-05-2015-1432138704.wav ./DEST
sox -m 1431709157.93900.0-in.wav; mv 1431709157.93900.0-in.wav ./DEST
sox -m 1431709157.93900.0-out.wav; mv 1431709157.93900.0-out.wav ./DEST
sox -m 1431709157.93900.1-in.wav; mv 1431709157.93900.1-in.wav ./DEST
sox -m 1431709157.93900.1-out.wav; mv 1431709157.93900.1-out.wav ./DEST
sox -m 1431710008.94059.0-in.wav; mv 1431710008.94059.0-in.wav ./DEST
sox -m 1431710008.94059.0-out.wav; mv 1431710008.94059.0-out.wav ./DEST
sox -m 1431710008.94059.1-in.wav; mv 1431710008.94059.1-in.wav ./DEST
sox -m 1431710008.94059.1-out.wav; mv 1431710008.94059.1-out.wav ./DEST
mv 1431710008.94059.1.wav ./DEST
mv 1431710008.94059.2.wav ./DEST
sox -m 1431713190.94698.2-in.wav; mv 1431713190.94698.2-in.wav ./DEST
sox -m 1431713190.94698.2-out.wav; mv 1431713190.94698.2-out.wav ./DEST
mv 1431713190.94698.2.wav ./DEST
sox -m 1431721107.96010.0-in.wav; mv 1431721107.96010.0-in.wav ./DEST
sox -m 1431721107.96010.0-out.wav; mv 1431721107.96010.0-out.wav ./DEST
mv 1431721107.96010.1.wav ./DEST
mv DEST ./DEST
如果要执行这些命令,只需将这些行剪切并粘贴到shell中,或者修改bash脚本以执行这些命令,而不是打印它们。

这应该可以:

#!/bin/bash
regex='(.*)(-out|-in)(.txt)'
for file in *.txt;do
# $file is the full path to the file
  if [[ $file =~ $regex ]];then
  #filename in this block contains -in or -out 
    filename="${file##*\/}"
    inorout="${BASH_REMATCH[2]}"
    extension="${BASH_REMATCH[3]}"
    filenamewithoutextension="${filename%.*}"
    filenamewithoutioroutorextension="${filenamewithoutextension/%$inorout/}"
    filenamewithoutiorout="${filenamewithoutioroutorextension}$extension"
    echo "$filename" "$inorout" "$extension" "$filenamewithoutextension" "$filenamewithoutiorout" "$filenamewithoutioroutorextension"
    #do something here sox-m mv or whatever
  else
  #filename in this block doesn't contain -in or -out
    echo "do something else"
  fi
done
说明:

${file*\/}是从$file剪切*/后留下的字符串,即basename文件名

${BASH_REMATCH[2]}是[[$file=~$regex]]完成的模式匹配中的第二个捕获组,即-in或-out

${BASH_REMATCH[3]}是第三个捕获的组,即wav

${filename%.*}是从$file剪切。*后留下的字符串,即没有.wav的filename 您应该查看的资源:


到目前为止,你试过为此写些什么吗?告诉我们你的尝试,如果你有。标题说:如何从提到的列表中获取文件名,提到的列表在哪里?在文件中?或者你只需要一个目录中的每个文件?或者可以使用.wav扩展名?你至少应该明确你的需求,如果你要做的只是向别人索取代码…@EtanReisner,我尝试了一些查找和剪切的方法,因为我想要基本名称,但正如您所看到的,我已经在所有文件中找到了。@Jahid我有一个目录,其中包含wave文件,文件名如我的问题所示。请至少向我们展示您的尝试。使用您的脚本,它正在获取/some/path/filename.wav,因为我只需要源目录中的BASENAME。谢谢@Jahid。但您可能知道,我想要的是不带-IN/-OUT的基本文件名,这样我就可以混合使用IN/OUT和命名输出基本文件名。@AamirAhmed我添加了两个其他变量:filenamewithoutiorout和filenamewithoutioroutorextension