Add volume selection option for file extraction

This commit is contained in:
2026-03-26 10:39:03 +00:00
parent 26ca325071
commit 3be63e0bd4
4 changed files with 54 additions and 10 deletions

View File

@@ -741,6 +741,18 @@ namespace Aaru.Localization {
}
}
public static string Extract_only_from_specified_volume_number {
get {
return ResourceManager.GetString("Extract_only_from_specified_volume_number", resourceCulture);
}
}
public static string Volume_number_0_not_found_only_1_volumes_found {
get {
return ResourceManager.GetString("Volume_number_0_not_found_only_1_volumes_found", resourceCulture);
}
}
public static string Namespace_to_use_for_filenames {
get {
return ResourceManager.GetString("Namespace_to_use_for_filenames", resourceCulture);

View File

@@ -1116,6 +1116,12 @@
</data>
<data name="Extract_extended_attributes_if_present" xml:space="preserve">
<value>Extraer atributos extendidos si existen.</value>
</data>
<data name="Extract_only_from_specified_volume_number" xml:space="preserve">
<value>Extraer solo del número de volumen especificado (indexado desde 0). Si no se especifica, extrae de todos los volúmenes.</value>
</data>
<data name="Volume_number_0_not_found_only_1_volumes_found" xml:space="preserve">
<value>[red]No se encontró el volumen número [orange3]{0}[/]. Solo se encontraron [orange3]{1}[/] volúmenes.[/]</value>
</data>
<data name="Filename_0_not_supported_want_to_rename_to_1" xml:space="preserve">
<value>El nombre de fichero {0} no está soportado en esta plataforma. ¿Desea renombrarlo a {1}?</value>

View File

@@ -373,6 +373,12 @@ In you are unsure, please press N to not continue.</value>
</data>
<data name="Extract_extended_attributes_if_present" xml:space="preserve">
<value>Extract extended attributes if present.</value>
</data>
<data name="Extract_only_from_specified_volume_number" xml:space="preserve">
<value>Extract only from the specified volume number (0-indexed). If not specified, extracts from all volumes.</value>
</data>
<data name="Volume_number_0_not_found_only_1_volumes_found" xml:space="preserve">
<value>[red]Volume number [orange3]{0}[/] not found. Only [orange3]{1}[/] volumes were found.[/]</value>
</data>
<data name="Namespace_to_use_for_filenames" xml:space="preserve">
<value>Namespace to use for filenames.</value>

View File

@@ -69,6 +69,7 @@ sealed class ExtractFilesCommand : Command<ExtractFilesCommand.Settings>
AaruLogging.Debug(MODULE_NAME, "--options={0}", Markup.Escape(settings.Options ?? ""));
AaruLogging.Debug(MODULE_NAME, "--output={0}", Markup.Escape(settings.OutputDir ?? ""));
AaruLogging.Debug(MODULE_NAME, "--verbose={0}", settings.Verbose);
AaruLogging.Debug(MODULE_NAME, "--volume={0}", settings.Volume?.ToString() ?? "all");
AaruLogging.Debug(MODULE_NAME, "--xattrs={0}", settings.Xattrs);
IFilter inputFilter = null;
@@ -227,6 +228,8 @@ sealed class ExtractFilesCommand : Command<ExtractFilesCommand.Settings>
AaruLogging.WriteLine(UI._0_partitions_found, partitions.Count);
var volumeCounter = 0;
for(var i = 0; i < partitions.Count; i++)
{
AaruLogging.WriteLine();
@@ -274,15 +277,19 @@ sealed class ExtractFilesCommand : Command<ExtractFilesCommand.Settings>
if(error == ErrorNumber.NoError)
{
string volumeName = string.IsNullOrEmpty(fs.Metadata.VolumeName)
? "NO NAME"
: fs.Metadata.VolumeName;
if(!settings.Volume.HasValue || settings.Volume.Value == volumeCounter)
{
string volumeName = string.IsNullOrEmpty(fs.Metadata.VolumeName)
? "NO NAME"
: fs.Metadata.VolumeName;
volumeName = volumeName.Replace('/', '_').Replace('\\', '_');
volumeName = volumeName.Replace('/', '_').Replace('\\', '_');
ExtractFilesInDir("/", fs, volumeName, settings.OutputDir, settings.Xattrs);
ExtractFilesInDir("/", fs, volumeName, settings.OutputDir, settings.Xattrs);
}
Statistics.AddFilesystem(fs.Metadata.Type);
volumeCounter++;
}
else
AaruLogging.Error(UI.Unable_to_mount_volume_error_0, error.ToString());
@@ -309,21 +316,30 @@ sealed class ExtractFilesCommand : Command<ExtractFilesCommand.Settings>
if(error == ErrorNumber.NoError)
{
string volumeName = string.IsNullOrEmpty(fs.Metadata.VolumeName)
? "NO NAME"
: fs.Metadata.VolumeName;
if(!settings.Volume.HasValue || settings.Volume.Value == volumeCounter)
{
string volumeName = string.IsNullOrEmpty(fs.Metadata.VolumeName)
? "NO NAME"
: fs.Metadata.VolumeName;
volumeName = volumeName.Replace('/', '_').Replace('\\', '_');
volumeName = volumeName.Replace('/', '_').Replace('\\', '_');
ExtractFilesInDir("/", fs, volumeName, settings.OutputDir, settings.Xattrs);
ExtractFilesInDir("/", fs, volumeName, settings.OutputDir, settings.Xattrs);
}
Statistics.AddFilesystem(fs.Metadata.Type);
volumeCounter++;
}
else
AaruLogging.Error(UI.Unable_to_mount_volume_error_0, error.ToString());
}
}
}
if(settings.Volume.HasValue && settings.Volume.Value >= volumeCounter)
AaruLogging.Error(UI.Volume_number_0_not_found_only_1_volumes_found,
settings.Volume.Value,
volumeCounter);
}
catch(Exception ex)
{
@@ -677,6 +693,10 @@ sealed class ExtractFilesCommand : Command<ExtractFilesCommand.Settings>
[LocalizedDescription(nameof(UI.Extract_extended_attributes_if_present))]
[DefaultValue(false)]
public bool Xattrs { get; init; }
[CommandOption("--volume")]
[LocalizedDescription(nameof(UI.Extract_only_from_specified_volume_number))]
[DefaultValue(null)]
public int? Volume { get; init; }
[CommandOption("-n|--namespace")]
[LocalizedDescription(nameof(UI.Namespace_to_use_for_filenames))]
[DefaultValue(null)]